[jboss-svn-commits] JBL Code SVN: r17161 - in labs/jbossrules/trunk: drools-analytics/src/main/java/org/drools/analytics/report/components and 40 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Dec 10 13:37:24 EST 2007


Author: tirelli
Date: 2007-12-10 13:37:22 -0500 (Mon, 10 Dec 2007)
New Revision: 17161

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleEventAssertion.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleTimeWindow.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/import_event.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ClockType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/TemporalSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorCache.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooTemporalSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ImportDeclaration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94EventFactHandle.java
Removed:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java
Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ForallDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ImportDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PredicateDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RestrictionConnectiveDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaProcessClassBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaRuleClassBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/rules/QualifiedIdentifierRestrictionHandler.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/Operator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCalendarCoercion.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELDateCoercion.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AlphaNodeFieldConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELCalendarCoercionTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELDateCoercionTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/EqualityKeyTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/TripleBetaConstraintsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AccumulateNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/DefaultFactHandleFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
   labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandle.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
Log:
JBRULES-1384: merging temporal support for revisions 15772:17159 into trunk

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/PackageDescrFlattener.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -83,7 +83,7 @@
 		formPossibilities();
 	}
 
-	private void flatten(Collection<Object> descrs, AnalyticsComponent parent) {
+	private void flatten(Collection<?> descrs, AnalyticsComponent parent) {
 
 		int orderNumber = 0;
 
@@ -604,7 +604,7 @@
 		restriction.setConstraintId(currentConstraint.getId());
 		restriction.setFieldId(currentConstraint.getFieldId());
 		restriction.setOperator(Operator
-				.determineOperator(descr.getEvaluator()));
+				.determineOperator(descr.getEvaluator(), descr.isNegated()));
 		restriction.setVariable(variable);
 		restriction.setOrderNumber(orderNumber);
 		restriction.setParent(parent);
@@ -634,7 +634,7 @@
 		restriction.setConstraintId(currentConstraint.getId());
 		restriction.setFieldId(currentConstraint.getFieldId());
 		restriction.setOperator(Operator
-				.determineOperator(descr.getEvaluator()));
+				.determineOperator(descr.getEvaluator(), descr.isNegated()));
 		restriction.setClassMethodName(descr.getClassMethodName());
 		restriction.setContent(descr.getContent());
 		restriction.setDeclarations(descr.getDeclarations());
@@ -665,7 +665,7 @@
 		restriction.setConstraintId(currentConstraint.getId());
 		restriction.setFieldId(currentConstraint.getFieldId());
 		restriction.setOperator(Operator
-				.determineOperator(descr.getEvaluator()));
+				.determineOperator(descr.getEvaluator(), descr.isNegated()));
 		restriction.setValue(descr.getText());
 		restriction.setOrderNumber(orderNumber);
 		restriction.setParent(parent);
@@ -698,7 +698,7 @@
 		restriction.setConstraintId(currentConstraint.getId());
 		restriction.setFieldId(currentConstraint.getFieldId());
 		restriction.setOperator(Operator
-				.determineOperator(descr.getEvaluator()));
+				.determineOperator(descr.getEvaluator(), descr.isNegated()));
 		restriction.setVariableId(variable.getId());
 		restriction.setVariableName(text.substring(0, text.indexOf(".")));
 		restriction.setVariablePath(text.substring(text.indexOf(".")));

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/MissingRange.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -31,21 +31,9 @@
 			return Operator.LESS;
 		} else if (e.equals(Operator.LESS_OR_EQUAL)) {
 			return Operator.GREATER;
-		} else if (e.equals(Operator.MATCHES)) {
-			return Operator.NOT_MATCHES;
-		} else if (e.equals(Operator.NOT_MATCHES)) {
-			return Operator.MATCHES;
-		} else if (e.equals(Operator.CONTAINS)) {
-			return Operator.NOT_CONTAINS;
-		} else if (e.equals(Operator.NOT_CONTAINS)) {
-			return Operator.CONTAINS;
-		} else if (e.equals(Operator.MEMBEROF)) {
-			return Operator.NOTMEMBEROF;
-		} else if (e.equals(Operator.NOTMEMBEROF)) {
-			return Operator.MEMBEROF;
-		}
-
-		return e;
+		} else {
+            return Operator.determineOperator( e.getOperatorString(), !e.isNegated() );
+        }
 	}
 
 	public int compareTo(MissingRange another) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -32,7 +32,6 @@
 import org.drools.facttemplates.FactTemplateImpl;
 import org.drools.facttemplates.FieldTemplate;
 import org.drools.facttemplates.FieldTemplateImpl;
-import org.drools.lang.descr.ActionDescr;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
@@ -41,23 +40,14 @@
 import org.drools.lang.descr.GlobalDescr;
 import org.drools.lang.descr.ImportDescr;
 import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.ProcessDescr;
 import org.drools.lang.descr.QueryDescr;
 import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.ImportDeclaration;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
-import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.RuleBuilder;
-import org.drools.rule.builder.dialect.java.JavaDialect;
 import org.drools.ruleflow.common.core.Process;
-import org.drools.ruleflow.common.core.impl.ProcessImpl;
-import org.drools.ruleflow.core.ActionNode;
-import org.drools.ruleflow.core.Node;
-import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.ruleflow.core.impl.ActionNodeImpl;
-import org.drools.ruleflow.core.impl.DroolsConsequenceAction;
-import org.drools.xml.ExtensibleXmlParser;
 import org.drools.xml.SemanticModules;
 import org.drools.xml.XmlPackageReader;
 import org.drools.xml.XmlProcessReader;
@@ -146,12 +136,12 @@
         this.classFieldExtractorCache = ClassFieldExtractorCache.getInstance();
 
         if ( this.pkg != null ) {
-            this.typeResolver = new ClassTypeResolver( this.pkg.getImports(),
+            this.typeResolver = new ClassTypeResolver( new HashSet<String>( this.pkg.getImports().keySet() ),
                                                        this.configuration.getClassLoader() );
             // make an automatic import for the current package
             this.typeResolver.addImport( this.pkg.getName() + ".*" );
         } else {
-            this.typeResolver = new ClassTypeResolver( new HashSet(),
+            this.typeResolver = new ClassTypeResolver( new HashSet<String>(),
                                                        this.configuration.getClassLoader() );
         }
 
@@ -392,10 +382,11 @@
     private void mergePackage(final PackageDescr packageDescr) {
         final List imports = packageDescr.getImports();
         for ( final Iterator it = imports.iterator(); it.hasNext(); ) {
-            String importEntry = ((ImportDescr) it.next()).getTarget();
-            this.pkg.addImport( importEntry );
-            this.typeResolver.addImport( importEntry );
-            this.dialectRegistry.addImport( importEntry );
+            ImportDescr importEntry = (ImportDescr) it.next();
+            ImportDeclaration importDecl = new ImportDeclaration( importEntry.getTarget(), importEntry.isEvent() );
+            pkg.addImport( importDecl );
+            this.typeResolver.addImport( importDecl.getTarget() );            
+            this.dialectRegistry.addImport( importDecl.getTarget() );
         }
 
         for ( final Iterator it = packageDescr.getFunctionImports().iterator(); it.hasNext(); ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilderConfiguration.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -31,6 +31,8 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.accumulators.AccumulateFunction;
+import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.EvaluatorRegistry;
 import org.drools.util.ChainedProperties;
 import org.drools.xml.SemanticModule;
 import org.drools.xml.SemanticModules;
@@ -46,6 +48,7 @@
  * 
  * drools.dialect.default = <String>
  * drools.accumulate.function.<function name> = <qualified class>
+ * drools.evaluator.<ident> = <qualified class>
  * 
  * default dialect is java.
  * Available preconfigured Accumulate functions are:
@@ -59,6 +62,8 @@
 
     private static final String ACCUMULATE_FUNCTION_PREFIX = "drools.accumulate.function.";
     
+    private static final String EVALUATOR_DEFINITION_PREFIX = "drools.evaluator.";
+    
     private Map                 dialectConfigurations;
 
     private String              defaultDialect;
@@ -67,8 +72,10 @@
 
     private ChainedProperties   chainedProperties;
 
-    private Map                 accumulateFunctions;
+    private Map<String, String> accumulateFunctions;
     
+    private EvaluatorRegistry   evaluatorRegistry;
+    
     private SemanticModules     semanticModules;   
 
     /**
@@ -127,6 +134,8 @@
         buildDialectConfigurationMap();
 
         buildAccumulateFunctionsMap();
+        
+        buildEvaluatorRegistry();
     }
 
     public ChainedProperties getChainedProperties() {
@@ -331,7 +340,7 @@
 //        }
 
     private void buildAccumulateFunctionsMap() {
-        this.accumulateFunctions = new HashMap();
+        this.accumulateFunctions = new HashMap<String, String>();
         Map temp = new HashMap();
         this.chainedProperties.mapStartsWith( temp,
                                               ACCUMULATE_FUNCTION_PREFIX,
@@ -340,11 +349,11 @@
             Map.Entry entry = (Map.Entry) it.next();
             String identifier = ((String) entry.getKey()).trim().substring( ACCUMULATE_FUNCTION_PREFIX.length() );
             this.accumulateFunctions.put( identifier,
-                                          entry.getValue() );
+                                          (String) entry.getValue() );
         }
     }
 
-    public Map getAccumulateFunctionsMap() {
+    public Map<String, String> getAccumulateFunctionsMap() {
         return Collections.unmodifiableMap( this.accumulateFunctions );
     }
 
@@ -361,7 +370,7 @@
     }
 
     public AccumulateFunction getAccumulateFunction(String identifier) {
-        String className = (String) this.accumulateFunctions.get( identifier );
+        String className = this.accumulateFunctions.get( identifier );
         if ( className == null ) {
             throw new RuntimeDroolsException( "No accumulator function found for identifier: " + identifier );
         }
@@ -372,12 +381,59 @@
             throw new RuntimeDroolsException( "Error loading accumulator function for identifier " + identifier + ". Class " + className + " not found",
                                               e );
         } catch ( InstantiationException e ) {
-            throw new RuntimeDroolsException( "Error loading accumulator function for identifier " + identifier + ". Class " + className + " not found",
+            throw new RuntimeDroolsException( "Error loading accumulator function for identifier " + identifier + ". Instantiation failed for class " + className,
                                               e );
         } catch ( IllegalAccessException e ) {
-            throw new RuntimeDroolsException( "Error loading accumulator function for identifier " + identifier + ". Class " + className + " not found",
+            throw new RuntimeDroolsException( "Error loading accumulator function for identifier " + identifier + ". Illegal access to class " + className,
                                               e );
         }
     }
 
+    private void buildEvaluatorRegistry() {
+        this.evaluatorRegistry = new EvaluatorRegistry( this.classLoader );
+        Map temp = new HashMap();
+        this.chainedProperties.mapStartsWith( temp,
+                                              EVALUATOR_DEFINITION_PREFIX,
+                                              true );
+        for ( Iterator it = temp.values().iterator(); it.hasNext(); ) {
+            String className = (String) it.next();
+            this.evaluatorRegistry.addEvaluatorDefinition( className );
+        }
+    }
+
+    /**
+     * Returns the evaluator registry for this package builder configuration
+     * @return
+     */
+    public EvaluatorRegistry getEvaluatorRegistry() {
+        return this.evaluatorRegistry;
+    }
+
+    /**
+     * Adds an evaluator definition class to the registry using the
+     * evaluator class name. The class will be loaded and the corresponting
+     * evaluator ID will be added to the registry. In case there exists
+     * an implementation for that ID already, the new implementation will
+     * replace the previous one.
+     * 
+     * @param className the name of the class for the implementation definition.
+     *                  The class must implement the EvaluatorDefinition interface.
+     * 
+     */
+    public void addEvaluatorDefinition( String className ) {
+        this.evaluatorRegistry.addEvaluatorDefinition( className );
+    }
+
+    /**
+     * Adds an evaluator definition class to the registry. In case there exists
+     * an implementation for that evaluator ID already, the new implementation will
+     * replace the previous one.
+     * 
+     * @param def the evaluator definition to be added.
+     * 
+     */
+    public void addEvaluatorDefinition( EvaluatorDefinition def ) {
+        this.evaluatorRegistry.addEvaluatorDefinition( def );
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLLexer.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2007-11-12 18:04:45
+// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2007-12-10 14:18:28
 
 	package org.drools.lang;
 
@@ -10,97 +10,99 @@
 import java.util.Map;
 import java.util.HashMap;
 public class DRLLexer extends Lexer {
-    public static final int COMMA=11;
-    public static final int EXISTS=39;
+    public static final int COMMA=12;
+    public static final int EXISTS=40;
     public static final int T79=79;
-    public static final int AUTO_FOCUS=27;
-    public static final int END=14;
-    public static final int HexDigit=65;
-    public static final int FORALL=42;
-    public static final int TEMPLATE=15;
-    public static final int MISC=71;
-    public static final int FLOAT=55;
+    public static final int AUTO_FOCUS=28;
+    public static final int END=15;
+    public static final int HexDigit=67;
+    public static final int FORALL=43;
+    public static final int TEMPLATE=16;
+    public static final int MISC=73;
+    public static final int FLOAT=57;
     public static final int T74=74;
-    public static final int QUERY=13;
-    public static final int THEN=61;
-    public static final int RULE=16;
-    public static final int INIT=44;
+    public static final int QUERY=14;
+    public static final int THEN=63;
+    public static final int RULE=17;
+    public static final int INIT=45;
+    public static final int T83=83;
+    public static final int TILDE=55;
     public static final int IMPORT=5;
     public static final int PACKAGE=4;
-    public static final int DATE_EFFECTIVE=19;
-    public static final int OR=34;
-    public static final int DOT=8;
-    public static final int DOUBLE_PIPE=35;
-    public static final int AND=36;
+    public static final int DATE_EFFECTIVE=20;
+    public static final int OR=35;
+    public static final int DOT=9;
+    public static final int DOUBLE_PIPE=36;
+    public static final int AND=37;
     public static final int FUNCTION=6;
-    public static final int GLOBAL=9;
-    public static final int EscapeSequence=64;
-    public static final int DIALECT=32;
-    public static final int INT=25;
-    public static final int LOCK_ON_ACTIVE=33;
-    public static final int DATE_EXPIRES=21;
+    public static final int GLOBAL=10;
+    public static final int EscapeSequence=66;
+    public static final int DIALECT=33;
+    public static final int INT=26;
+    public static final int LOCK_ON_ACTIVE=34;
+    public static final int DATE_EXPIRES=22;
     public static final int T81=81;
-    public static final int LEFT_SQUARE=59;
-    public static final int CONTAINS=49;
-    public static final int SH_STYLE_SINGLE_LINE_COMMENT=68;
+    public static final int LEFT_SQUARE=61;
+    public static final int CONTAINS=50;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=70;
     public static final int T77=77;
-    public static final int ATTRIBUTES=18;
-    public static final int LEFT_CURLY=57;
-    public static final int RESULT=47;
-    public static final int ID=7;
-    public static final int FROM=38;
-    public static final int LEFT_PAREN=10;
-    public static final int ACTIVATION_GROUP=28;
-    public static final int DOUBLE_AMPER=37;
-    public static final int RIGHT_CURLY=58;
-    public static final int BOOL=23;
-    public static final int EXCLUDES=50;
-    public static final int SOUNDSLIKE=52;
-    public static final int T73=73;
-    public static final int MEMBEROF=53;
-    public static final int WHEN=17;
+    public static final int ATTRIBUTES=19;
+    public static final int EVENT=7;
+    public static final int LEFT_CURLY=59;
+    public static final int RESULT=48;
+    public static final int ID=8;
+    public static final int FROM=39;
+    public static final int LEFT_PAREN=11;
+    public static final int ACTIVATION_GROUP=29;
+    public static final int DOUBLE_AMPER=38;
+    public static final int RIGHT_CURLY=60;
+    public static final int BOOL=24;
+    public static final int EXCLUDES=51;
+    public static final int SOUNDSLIKE=53;
+    public static final int MEMBEROF=54;
+    public static final int WHEN=18;
     public static final int T78=78;
-    public static final int RULEFLOW_GROUP=29;
-    public static final int WS=63;
-    public static final int STRING=20;
-    public static final int ACTION=45;
-    public static final int T72=72;
-    public static final int COLLECT=48;
+    public static final int RULEFLOW_GROUP=30;
+    public static final int WS=65;
+    public static final int STRING=21;
+    public static final int ACTION=46;
+    public static final int COLLECT=49;
     public static final int T76=76;
-    public static final int REVERSE=46;
-    public static final int IN=54;
+    public static final int REVERSE=47;
+    public static final int IN=56;
     public static final int T80=80;
-    public static final int ACCUMULATE=43;
-    public static final int NO_LOOP=26;
-    public static final int UnicodeEscape=66;
+    public static final int NO_LOOP=27;
+    public static final int ACCUMULATE=44;
+    public static final int UnicodeEscape=68;
     public static final int T75=75;
-    public static final int DURATION=31;
-    public static final int EVAL=41;
-    public static final int MATCHES=51;
+    public static final int DURATION=32;
+    public static final int EVAL=42;
+    public static final int MATCHES=52;
     public static final int EOF=-1;
-    public static final int AGENDA_GROUP=30;
-    public static final int NULL=56;
-    public static final int EOL=62;
-    public static final int Tokens=82;
-    public static final int SALIENCE=24;
-    public static final int OctalEscape=67;
-    public static final int MULTI_LINE_COMMENT=70;
-    public static final int NOT=40;
-    public static final int RIGHT_PAREN=12;
-    public static final int ENABLED=22;
-    public static final int RIGHT_SQUARE=60;
-    public static final int C_STYLE_SINGLE_LINE_COMMENT=69;
+    public static final int AGENDA_GROUP=31;
+    public static final int NULL=58;
+    public static final int EOL=64;
+    public static final int Tokens=84;
+    public static final int T82=82;
+    public static final int SALIENCE=25;
+    public static final int OctalEscape=69;
+    public static final int MULTI_LINE_COMMENT=72;
+    public static final int NOT=41;
+    public static final int RIGHT_PAREN=13;
+    public static final int ENABLED=23;
+    public static final int RIGHT_SQUARE=62;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=71;
     public DRLLexer() {;} 
     public DRLLexer(CharStream input) {
         super(input);
-        ruleMemo = new HashMap[80+1];
+        ruleMemo = new HashMap[82+1];
      }
     public String getGrammarFileName() { return "/home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g"; }
 
-    // $ANTLR start T72
-    public final void mT72() throws RecognitionException {
+    // $ANTLR start T74
+    public final void mT74() throws RecognitionException {
         try {
-            int _type = T72;
+            int _type = T74;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:6:5: ( ';' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:6:7: ';'
             {
@@ -113,12 +115,12 @@
         finally {
         }
     }
-    // $ANTLR end T72
+    // $ANTLR end T74
 
-    // $ANTLR start T73
-    public final void mT73() throws RecognitionException {
+    // $ANTLR start T75
+    public final void mT75() throws RecognitionException {
         try {
-            int _type = T73;
+            int _type = T75;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:7:5: ( '.*' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:7:7: '.*'
             {
@@ -132,12 +134,12 @@
         finally {
         }
     }
-    // $ANTLR end T73
+    // $ANTLR end T75
 
-    // $ANTLR start T74
-    public final void mT74() throws RecognitionException {
+    // $ANTLR start T76
+    public final void mT76() throws RecognitionException {
         try {
-            int _type = T74;
+            int _type = T76;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:8:5: ( ':' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:8:7: ':'
             {
@@ -150,12 +152,12 @@
         finally {
         }
     }
-    // $ANTLR end T74
+    // $ANTLR end T76
 
-    // $ANTLR start T75
-    public final void mT75() throws RecognitionException {
+    // $ANTLR start T77
+    public final void mT77() throws RecognitionException {
         try {
-            int _type = T75;
+            int _type = T77;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:9:5: ( '->' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:9:7: '->'
             {
@@ -169,12 +171,12 @@
         finally {
         }
     }
-    // $ANTLR end T75
+    // $ANTLR end T77
 
-    // $ANTLR start T76
-    public final void mT76() throws RecognitionException {
+    // $ANTLR start T78
+    public final void mT78() throws RecognitionException {
         try {
-            int _type = T76;
+            int _type = T78;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:10:5: ( '==' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:10:7: '=='
             {
@@ -188,12 +190,12 @@
         finally {
         }
     }
-    // $ANTLR end T76
+    // $ANTLR end T78
 
-    // $ANTLR start T77
-    public final void mT77() throws RecognitionException {
+    // $ANTLR start T79
+    public final void mT79() throws RecognitionException {
         try {
-            int _type = T77;
+            int _type = T79;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:11:5: ( '>' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:11:7: '>'
             {
@@ -206,12 +208,12 @@
         finally {
         }
     }
-    // $ANTLR end T77
+    // $ANTLR end T79
 
-    // $ANTLR start T78
-    public final void mT78() throws RecognitionException {
+    // $ANTLR start T80
+    public final void mT80() throws RecognitionException {
         try {
-            int _type = T78;
+            int _type = T80;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:12:5: ( '>=' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:12:7: '>='
             {
@@ -225,12 +227,12 @@
         finally {
         }
     }
-    // $ANTLR end T78
+    // $ANTLR end T80
 
-    // $ANTLR start T79
-    public final void mT79() throws RecognitionException {
+    // $ANTLR start T81
+    public final void mT81() throws RecognitionException {
         try {
-            int _type = T79;
+            int _type = T81;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:13:5: ( '<' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:13:7: '<'
             {
@@ -243,12 +245,12 @@
         finally {
         }
     }
-    // $ANTLR end T79
+    // $ANTLR end T81
 
-    // $ANTLR start T80
-    public final void mT80() throws RecognitionException {
+    // $ANTLR start T82
+    public final void mT82() throws RecognitionException {
         try {
-            int _type = T80;
+            int _type = T82;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:14:5: ( '<=' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:14:7: '<='
             {
@@ -262,12 +264,12 @@
         finally {
         }
     }
-    // $ANTLR end T80
+    // $ANTLR end T82
 
-    // $ANTLR start T81
-    public final void mT81() throws RecognitionException {
+    // $ANTLR start T83
+    public final void mT83() throws RecognitionException {
         try {
-            int _type = T81;
+            int _type = T83;
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:15:5: ( '!=' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:15:7: '!='
             {
@@ -281,16 +283,16 @@
         finally {
         }
     }
-    // $ANTLR end T81
+    // $ANTLR end T83
 
     // $ANTLR start WS
     public final void mWS() throws RecognitionException {
         try {
             int _type = WS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:9: ( ( ' ' | '\\t' | '\\f' | EOL )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:17: ( ' ' | '\\t' | '\\f' | EOL )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:9: ( ( ' ' | '\\t' | '\\f' | EOL )+ )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:17: ( ' ' | '\\t' | '\\f' | EOL )+
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:17: ( ' ' | '\\t' | '\\f' | EOL )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:17: ( ' ' | '\\t' | '\\f' | EOL )+
             int cnt1=0;
             loop1:
             do {
@@ -322,28 +324,28 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1692:19: ' '
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:19: ' '
             	    {
             	    match(' '); if (failed) return ;
 
             	    }
             	    break;
             	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1693:19: '\\t'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1710:19: '\\t'
             	    {
             	    match('\t'); if (failed) return ;
 
             	    }
             	    break;
             	case 3 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1694:19: '\\f'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1711:19: '\\f'
             	    {
             	    match('\f'); if (failed) return ;
 
             	    }
             	    break;
             	case 4 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1695:19: EOL
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1712:19: EOL
             	    {
             	    mEOL(); if (failed) return ;
 
@@ -376,10 +378,10 @@
     // $ANTLR start EOL
     public final void mEOL() throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1701:6: ( ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:6: ( ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )
             int alt2=3;
             int LA2_0 = input.LA(1);
 
@@ -398,13 +400,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1702:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )", 2, 0, input);
+                    new NoViableAltException("1719:6: ( ( '\\r\\n' )=> '\\r\\n' | '\\r' | '\\n' )", 2, 0, input);
 
                 throw nvae;
             }
             switch (alt2) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:14: ( '\\r\\n' )=> '\\r\\n'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:14: ( '\\r\\n' )=> '\\r\\n'
                     {
                     match("\r\n"); if (failed) return ;
 
@@ -412,14 +414,14 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1703:25: '\\r'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1720:25: '\\r'
                     {
                     match('\r'); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1704:25: '\\n'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1721:25: '\\n'
                     {
                     match('\n'); if (failed) return ;
 
@@ -441,10 +443,10 @@
     public final void mINT() throws RecognitionException {
         try {
             int _type = INT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:2: ( ( '-' )? ( '0' .. '9' )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:4: ( '-' )? ( '0' .. '9' )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:2: ( ( '-' )? ( '0' .. '9' )+ )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:4: ( '-' )? ( '0' .. '9' )+
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:4: ( '-' )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:4: ( '-' )?
             int alt3=2;
             int LA3_0 = input.LA(1);
 
@@ -453,7 +455,7 @@
             }
             switch (alt3) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:5: '-'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:5: '-'
                     {
                     match('-'); if (failed) return ;
 
@@ -462,7 +464,7 @@
 
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:10: ( '0' .. '9' )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:10: ( '0' .. '9' )+
             int cnt4=0;
             loop4:
             do {
@@ -476,7 +478,7 @@
 
                 switch (alt4) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1709:11: '0' .. '9'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:11: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -507,10 +509,10 @@
     public final void mFLOAT() throws RecognitionException {
         try {
             int _type = FLOAT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:2: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:4: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:2: ( ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+ )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:4: ( '-' )? ( '0' .. '9' )+ '.' ( '0' .. '9' )+
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:4: ( '-' )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:4: ( '-' )?
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -519,7 +521,7 @@
             }
             switch (alt5) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:5: '-'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:5: '-'
                     {
                     match('-'); if (failed) return ;
 
@@ -528,7 +530,7 @@
 
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:10: ( '0' .. '9' )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:10: ( '0' .. '9' )+
             int cnt6=0;
             loop6:
             do {
@@ -542,7 +544,7 @@
 
                 switch (alt6) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:11: '0' .. '9'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:11: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -560,7 +562,7 @@
             } while (true);
 
             match('.'); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:26: ( '0' .. '9' )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:26: ( '0' .. '9' )+
             int cnt7=0;
             loop7:
             do {
@@ -574,7 +576,7 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1713:27: '0' .. '9'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:27: '0' .. '9'
             	    {
             	    matchRange('0','9'); if (failed) return ;
 
@@ -605,7 +607,7 @@
     public final void mSTRING() throws RecognitionException {
         try {
             int _type = STRING;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:5: ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:5: ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -618,19 +620,19 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1716:1: STRING : ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) );", 10, 0, input);
+                    new NoViableAltException("1733:1: STRING : ( ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' ) | ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' ) );", 10, 0, input);
 
                 throw nvae;
             }
             switch (alt10) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:9: '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:8: ( '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:9: '\"' ( EscapeSequence | ~ ( '\\\\' | '\"' ) )* '\"'
                     {
                     match('\"'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:13: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:13: ( EscapeSequence | ~ ( '\\\\' | '\"' ) )*
                     loop8:
                     do {
                         int alt8=3;
@@ -646,14 +648,14 @@
 
                         switch (alt8) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:15: EscapeSequence
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:15: EscapeSequence
                     	    {
                     	    mEscapeSequence(); if (failed) return ;
 
                     	    }
                     	    break;
                     	case 2 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1717:32: ~ ( '\\\\' | '\"' )
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1734:32: ~ ( '\\\\' | '\"' )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
                     	        input.consume();
@@ -683,13 +685,13 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:9: '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\''
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:8: ( '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\'' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:9: '\\'' ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )* '\\''
                     {
                     match('\''); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:14: ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:14: ( EscapeSequence | ~ ( '\\\\' | '\\'' ) )*
                     loop9:
                     do {
                         int alt9=3;
@@ -705,14 +707,14 @@
 
                         switch (alt9) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:16: EscapeSequence
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:16: EscapeSequence
                     	    {
                     	    mEscapeSequence(); if (failed) return ;
 
                     	    }
                     	    break;
                     	case 2 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1718:33: ~ ( '\\\\' | '\\'' )
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1735:33: ~ ( '\\\\' | '\\'' )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFE') ) {
                     	        input.consume();
@@ -753,8 +755,8 @@
     // $ANTLR start HexDigit
     public final void mHexDigit() throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1722:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1722:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1739:10: ( ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1739:12: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )
             {
             if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='F')||(input.LA(1)>='a' && input.LA(1)<='f') ) {
                 input.consume();
@@ -779,7 +781,7 @@
     // $ANTLR start EscapeSequence
     public final void mEscapeSequence() throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:5: ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1743:5: ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape )
             int alt11=3;
             int LA11_0 = input.LA(1);
 
@@ -851,7 +853,7 @@
                 default:
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1724:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 1, input);
+                        new NoViableAltException("1741:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 1, input);
 
                     throw nvae;
                 }
@@ -860,13 +862,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1724:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 0, input);
+                    new NoViableAltException("1741:1: fragment EscapeSequence : ( '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' ) | UnicodeEscape | OctalEscape );", 11, 0, input);
 
                 throw nvae;
             }
             switch (alt11) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1726:9: '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1743:9: '\\\\' ( 'b' | 'B' | 't' | 'n' | 'f' | 'r' | '\\\"' | '\\'' | '\\\\' | '.' | 'o' | 'x' | 'a' | 'e' | 'c' | 'd' | 'D' | 's' | 'S' | 'w' | 'W' | 'p' | 'A' | 'G' | 'Z' | 'z' | 'Q' | 'E' | '*' | '[' | ']' | '(' | ')' | '$' | '^' | '{' | '}' | '?' | '+' | '-' | '&' | '|' )
                     {
                     match('\\'); if (failed) return ;
                     if ( input.LA(1)=='\"'||input.LA(1)=='$'||(input.LA(1)>='&' && input.LA(1)<='+')||(input.LA(1)>='-' && input.LA(1)<='.')||input.LA(1)=='?'||(input.LA(1)>='A' && input.LA(1)<='B')||(input.LA(1)>='D' && input.LA(1)<='E')||input.LA(1)=='G'||input.LA(1)=='Q'||input.LA(1)=='S'||input.LA(1)=='W'||(input.LA(1)>='Z' && input.LA(1)<='^')||(input.LA(1)>='a' && input.LA(1)<='f')||(input.LA(1)>='n' && input.LA(1)<='p')||(input.LA(1)>='r' && input.LA(1)<='t')||(input.LA(1)>='w' && input.LA(1)<='x')||(input.LA(1)>='z' && input.LA(1)<='}') ) {
@@ -884,14 +886,14 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1730:9: UnicodeEscape
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:9: UnicodeEscape
                     {
                     mUnicodeEscape(); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1731:9: OctalEscape
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1748:9: OctalEscape
                     {
                     mOctalEscape(); if (failed) return ;
 
@@ -908,7 +910,7 @@
     // $ANTLR start OctalEscape
     public final void mOctalEscape() throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:5: ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) )
             int alt12=3;
             int LA12_0 = input.LA(1);
 
@@ -919,9 +921,9 @@
                     int LA12_2 = input.LA(3);
 
                     if ( ((LA12_2>='0' && LA12_2<='7')) ) {
-                        int LA12_5 = input.LA(4);
+                        int LA12_4 = input.LA(4);
 
-                        if ( ((LA12_5>='0' && LA12_5<='7')) ) {
+                        if ( ((LA12_4>='0' && LA12_4<='7')) ) {
                             alt12=1;
                         }
                         else {
@@ -942,7 +944,7 @@
                 else {
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1734:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 1, input);
+                        new NoViableAltException("1751:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 1, input);
 
                     throw nvae;
                 }
@@ -950,31 +952,31 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1734:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 0, input);
+                    new NoViableAltException("1751:1: fragment OctalEscape : ( '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) ( '0' .. '7' ) | '\\\\' ( '0' .. '7' ) );", 12, 0, input);
 
                 throw nvae;
             }
             switch (alt12) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:9: '\\\\' ( '0' .. '3' ) ( '0' .. '7' ) ( '0' .. '7' )
                     {
                     match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:14: ( '0' .. '3' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:15: '0' .. '3'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:14: ( '0' .. '3' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:15: '0' .. '3'
                     {
                     matchRange('0','3'); if (failed) return ;
 
                     }
 
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:25: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:26: '0' .. '7'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:25: ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:26: '0' .. '7'
                     {
                     matchRange('0','7'); if (failed) return ;
 
                     }
 
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:36: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1736:37: '0' .. '7'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:36: ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1753:37: '0' .. '7'
                     {
                     matchRange('0','7'); if (failed) return ;
 
@@ -984,18 +986,18 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1737:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:9: '\\\\' ( '0' .. '7' ) ( '0' .. '7' )
                     {
                     match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1737:14: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1737:15: '0' .. '7'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:14: ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:15: '0' .. '7'
                     {
                     matchRange('0','7'); if (failed) return ;
 
                     }
 
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1737:25: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1737:26: '0' .. '7'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:25: ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:26: '0' .. '7'
                     {
                     matchRange('0','7'); if (failed) return ;
 
@@ -1005,11 +1007,11 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1738:9: '\\\\' ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1755:9: '\\\\' ( '0' .. '7' )
                     {
                     match('\\'); if (failed) return ;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1738:14: ( '0' .. '7' )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1738:15: '0' .. '7'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1755:14: ( '0' .. '7' )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1755:15: '0' .. '7'
                     {
                     matchRange('0','7'); if (failed) return ;
 
@@ -1029,8 +1031,8 @@
     // $ANTLR start UnicodeEscape
     public final void mUnicodeEscape() throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1743:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1743:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1760:5: ( '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1760:9: '\\\\' 'u' HexDigit HexDigit HexDigit HexDigit
             {
             match('\\'); if (failed) return ;
             match('u'); if (failed) return ;
@@ -1051,10 +1053,10 @@
     public final void mBOOL() throws RecognitionException {
         try {
             int _type = BOOL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:2: ( ( 'true' | 'false' ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:4: ( 'true' | 'false' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:2: ( ( 'true' | 'false' ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:4: ( 'true' | 'false' )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:4: ( 'true' | 'false' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:4: ( 'true' | 'false' )
             int alt13=2;
             int LA13_0 = input.LA(1);
 
@@ -1067,13 +1069,13 @@
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1747:4: ( 'true' | 'false' )", 13, 0, input);
+                    new NoViableAltException("1764:4: ( 'true' | 'false' )", 13, 0, input);
 
                 throw nvae;
             }
             switch (alt13) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:5: 'true'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:5: 'true'
                     {
                     match("true"); if (failed) return ;
 
@@ -1081,7 +1083,7 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1747:12: 'false'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:12: 'false'
                     {
                     match("false"); if (failed) return ;
 
@@ -1105,8 +1107,8 @@
     public final void mPACKAGE() throws RecognitionException {
         try {
             int _type = PACKAGE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1750:9: ( 'package' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1750:11: 'package'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1767:9: ( 'package' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1767:11: 'package'
             {
             match("package"); if (failed) return ;
 
@@ -1124,8 +1126,8 @@
     public final void mIMPORT() throws RecognitionException {
         try {
             int _type = IMPORT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1752:8: ( 'import' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1752:10: 'import'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1769:8: ( 'import' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1769:10: 'import'
             {
             match("import"); if (failed) return ;
 
@@ -1143,8 +1145,8 @@
     public final void mFUNCTION() throws RecognitionException {
         try {
             int _type = FUNCTION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:10: ( 'function' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1754:12: 'function'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1771:10: ( 'function' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1771:12: 'function'
             {
             match("function"); if (failed) return ;
 
@@ -1158,12 +1160,31 @@
     }
     // $ANTLR end FUNCTION
 
+    // $ANTLR start EVENT
+    public final void mEVENT() throws RecognitionException {
+        try {
+            int _type = EVENT;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1773:7: ( 'event' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1773:10: 'event'
+            {
+            match("event"); if (failed) return ;
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EVENT
+
     // $ANTLR start GLOBAL
     public final void mGLOBAL() throws RecognitionException {
         try {
             int _type = GLOBAL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1756:8: ( 'global' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1756:10: 'global'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1775:8: ( 'global' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1775:10: 'global'
             {
             match("global"); if (failed) return ;
 
@@ -1181,8 +1202,8 @@
     public final void mRULE() throws RecognitionException {
         try {
             int _type = RULE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1758:9: ( 'rule' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1758:11: 'rule'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1777:9: ( 'rule' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1777:11: 'rule'
             {
             match("rule"); if (failed) return ;
 
@@ -1200,8 +1221,8 @@
     public final void mQUERY() throws RecognitionException {
         try {
             int _type = QUERY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1760:7: ( 'query' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1760:9: 'query'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1779:7: ( 'query' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1779:9: 'query'
             {
             match("query"); if (failed) return ;
 
@@ -1219,8 +1240,8 @@
     public final void mTEMPLATE() throws RecognitionException {
         try {
             int _type = TEMPLATE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1762:10: ( 'template' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1762:12: 'template'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1781:10: ( 'template' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1781:12: 'template'
             {
             match("template"); if (failed) return ;
 
@@ -1238,8 +1259,8 @@
     public final void mATTRIBUTES() throws RecognitionException {
         try {
             int _type = ATTRIBUTES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:12: ( 'attributes' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1764:14: 'attributes'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1783:12: ( 'attributes' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1783:14: 'attributes'
             {
             match("attributes"); if (failed) return ;
 
@@ -1257,8 +1278,8 @@
     public final void mDATE_EFFECTIVE() throws RecognitionException {
         try {
             int _type = DATE_EFFECTIVE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1767:2: ( 'date-effective' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1767:4: 'date-effective'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1786:2: ( 'date-effective' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1786:4: 'date-effective'
             {
             match("date-effective"); if (failed) return ;
 
@@ -1276,8 +1297,8 @@
     public final void mDATE_EXPIRES() throws RecognitionException {
         try {
             int _type = DATE_EXPIRES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:2: ( 'date-expires' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1770:4: 'date-expires'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1789:2: ( 'date-expires' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1789:4: 'date-expires'
             {
             match("date-expires"); if (failed) return ;
 
@@ -1295,8 +1316,8 @@
     public final void mENABLED() throws RecognitionException {
         try {
             int _type = ENABLED;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1772:9: ( 'enabled' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1772:11: 'enabled'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:9: ( 'enabled' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1791:11: 'enabled'
             {
             match("enabled"); if (failed) return ;
 
@@ -1314,8 +1335,8 @@
     public final void mSALIENCE() throws RecognitionException {
         try {
             int _type = SALIENCE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1775:2: ( 'salience' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1775:4: 'salience'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1794:2: ( 'salience' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1794:4: 'salience'
             {
             match("salience"); if (failed) return ;
 
@@ -1333,8 +1354,8 @@
     public final void mNO_LOOP() throws RecognitionException {
         try {
             int _type = NO_LOOP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1777:9: ( 'no-loop' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1777:11: 'no-loop'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:9: ( 'no-loop' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1796:11: 'no-loop'
             {
             match("no-loop"); if (failed) return ;
 
@@ -1352,8 +1373,8 @@
     public final void mAUTO_FOCUS() throws RecognitionException {
         try {
             int _type = AUTO_FOCUS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:2: ( 'auto-focus' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1780:4: 'auto-focus'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1799:2: ( 'auto-focus' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1799:4: 'auto-focus'
             {
             match("auto-focus"); if (failed) return ;
 
@@ -1371,8 +1392,8 @@
     public final void mACTIVATION_GROUP() throws RecognitionException {
         try {
             int _type = ACTIVATION_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1783:2: ( 'activation-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1783:4: 'activation-group'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1802:2: ( 'activation-group' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1802:4: 'activation-group'
             {
             match("activation-group"); if (failed) return ;
 
@@ -1390,8 +1411,8 @@
     public final void mAGENDA_GROUP() throws RecognitionException {
         try {
             int _type = AGENDA_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1786:2: ( 'agenda-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1786:4: 'agenda-group'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1805:2: ( 'agenda-group' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1805:4: 'agenda-group'
             {
             match("agenda-group"); if (failed) return ;
 
@@ -1409,8 +1430,8 @@
     public final void mDIALECT() throws RecognitionException {
         try {
             int _type = DIALECT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1789:2: ( 'dialect' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1789:4: 'dialect'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1808:2: ( 'dialect' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1808:4: 'dialect'
             {
             match("dialect"); if (failed) return ;
 
@@ -1428,8 +1449,8 @@
     public final void mRULEFLOW_GROUP() throws RecognitionException {
         try {
             int _type = RULEFLOW_GROUP;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1792:2: ( 'ruleflow-group' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1792:4: 'ruleflow-group'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1811:2: ( 'ruleflow-group' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1811:4: 'ruleflow-group'
             {
             match("ruleflow-group"); if (failed) return ;
 
@@ -1447,8 +1468,8 @@
     public final void mDURATION() throws RecognitionException {
         try {
             int _type = DURATION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:2: ( 'duration' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1795:4: 'duration'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:2: ( 'duration' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1814:4: 'duration'
             {
             match("duration"); if (failed) return ;
 
@@ -1466,8 +1487,8 @@
     public final void mLOCK_ON_ACTIVE() throws RecognitionException {
         try {
             int _type = LOCK_ON_ACTIVE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1798:2: ( 'lock-on-active' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1798:4: 'lock-on-active'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1817:2: ( 'lock-on-active' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1817:4: 'lock-on-active'
             {
             match("lock-on-active"); if (failed) return ;
 
@@ -1485,8 +1506,8 @@
     public final void mFROM() throws RecognitionException {
         try {
             int _type = FROM;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1800:6: ( 'from' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1800:8: 'from'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1819:6: ( 'from' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1819:8: 'from'
             {
             match("from"); if (failed) return ;
 
@@ -1504,8 +1525,8 @@
     public final void mACCUMULATE() throws RecognitionException {
         try {
             int _type = ACCUMULATE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1803:2: ( 'accumulate' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1803:4: 'accumulate'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1822:2: ( 'accumulate' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1822:4: 'accumulate'
             {
             match("accumulate"); if (failed) return ;
 
@@ -1523,8 +1544,8 @@
     public final void mINIT() throws RecognitionException {
         try {
             int _type = INIT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1805:6: ( 'init' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1805:8: 'init'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1824:6: ( 'init' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1824:8: 'init'
             {
             match("init"); if (failed) return ;
 
@@ -1542,8 +1563,8 @@
     public final void mACTION() throws RecognitionException {
         try {
             int _type = ACTION;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1807:8: ( 'action' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1807:10: 'action'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1826:8: ( 'action' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1826:10: 'action'
             {
             match("action"); if (failed) return ;
 
@@ -1561,8 +1582,8 @@
     public final void mREVERSE() throws RecognitionException {
         try {
             int _type = REVERSE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1809:9: ( 'reverse' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1809:11: 'reverse'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:9: ( 'reverse' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:11: 'reverse'
             {
             match("reverse"); if (failed) return ;
 
@@ -1580,8 +1601,8 @@
     public final void mRESULT() throws RecognitionException {
         try {
             int _type = RESULT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1811:8: ( 'result' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1811:10: 'result'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:8: ( 'result' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:10: 'result'
             {
             match("result"); if (failed) return ;
 
@@ -1599,8 +1620,8 @@
     public final void mCOLLECT() throws RecognitionException {
         try {
             int _type = COLLECT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1813:9: ( 'collect' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1813:11: 'collect'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:9: ( 'collect' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:11: 'collect'
             {
             match("collect"); if (failed) return ;
 
@@ -1618,8 +1639,8 @@
     public final void mOR() throws RecognitionException {
         try {
             int _type = OR;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:4: ( 'or' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1815:6: 'or'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:4: ( 'or' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:6: 'or'
             {
             match("or"); if (failed) return ;
 
@@ -1637,8 +1658,8 @@
     public final void mAND() throws RecognitionException {
         try {
             int _type = AND;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1817:5: ( 'and' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1817:7: 'and'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:5: ( 'and' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:7: 'and'
             {
             match("and"); if (failed) return ;
 
@@ -1656,8 +1677,8 @@
     public final void mCONTAINS() throws RecognitionException {
         try {
             int _type = CONTAINS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1820:2: ( 'contains' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1820:4: 'contains'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1839:8: ( 'contains' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1839:16: 'contains'
             {
             match("contains"); if (failed) return ;
 
@@ -1675,8 +1696,8 @@
     public final void mEXCLUDES() throws RecognitionException {
         try {
             int _type = EXCLUDES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1823:2: ( 'excludes' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1823:4: 'excludes'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:8: ( 'excludes' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:16: 'excludes'
             {
             match("excludes"); if (failed) return ;
 
@@ -1694,8 +1715,8 @@
     public final void mMEMBEROF() throws RecognitionException {
         try {
             int _type = MEMBEROF;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1826:2: ( 'memberOf' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1826:4: 'memberOf'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1845:8: ( 'memberOf' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1845:16: 'memberOf'
             {
             match("memberOf"); if (failed) return ;
 
@@ -1713,8 +1734,8 @@
     public final void mMATCHES() throws RecognitionException {
         try {
             int _type = MATCHES;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:9: ( 'matches' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1828:11: 'matches'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1847:9: ( 'matches' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1847:16: 'matches'
             {
             match("matches"); if (failed) return ;
 
@@ -1732,8 +1753,8 @@
     public final void mSOUNDSLIKE() throws RecognitionException {
         try {
             int _type = SOUNDSLIKE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:12: ( 'soundslike' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1830:14: 'soundslike'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1849:12: ( 'soundslike' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1849:16: 'soundslike'
             {
             match("soundslike"); if (failed) return ;
 
@@ -1751,8 +1772,8 @@
     public final void mIN() throws RecognitionException {
         try {
             int _type = IN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:4: ( 'in' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1832:6: 'in'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1851:4: ( 'in' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1851:6: 'in'
             {
             match("in"); if (failed) return ;
 
@@ -1770,8 +1791,8 @@
     public final void mNULL() throws RecognitionException {
         try {
             int _type = NULL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:6: ( 'null' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1834:8: 'null'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1853:6: ( 'null' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1853:8: 'null'
             {
             match("null"); if (failed) return ;
 
@@ -1789,8 +1810,8 @@
     public final void mEXISTS() throws RecognitionException {
         try {
             int _type = EXISTS;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:8: ( 'exists' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1836:10: 'exists'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1855:8: ( 'exists' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1855:10: 'exists'
             {
             match("exists"); if (failed) return ;
 
@@ -1808,8 +1829,8 @@
     public final void mNOT() throws RecognitionException {
         try {
             int _type = NOT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1838:5: ( 'not' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1838:7: 'not'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1857:5: ( 'not' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1857:7: 'not'
             {
             match("not"); if (failed) return ;
 
@@ -1827,8 +1848,8 @@
     public final void mEVAL() throws RecognitionException {
         try {
             int _type = EVAL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1840:6: ( 'eval' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1840:8: 'eval'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:6: ( 'eval' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:8: 'eval'
             {
             match("eval"); if (failed) return ;
 
@@ -1846,8 +1867,8 @@
     public final void mFORALL() throws RecognitionException {
         try {
             int _type = FORALL;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:8: ( 'forall' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1842:10: 'forall'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1861:8: ( 'forall' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1861:10: 'forall'
             {
             match("forall"); if (failed) return ;
 
@@ -1865,8 +1886,8 @@
     public final void mWHEN() throws RecognitionException {
         try {
             int _type = WHEN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1844:9: ( 'when' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1844:11: 'when'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1863:9: ( 'when' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1863:11: 'when'
             {
             match("when"); if (failed) return ;
 
@@ -1884,8 +1905,8 @@
     public final void mTHEN() throws RecognitionException {
         try {
             int _type = THEN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1846:6: ( 'then' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1846:12: 'then'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1865:6: ( 'then' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1865:12: 'then'
             {
             match("then"); if (failed) return ;
 
@@ -1903,8 +1924,8 @@
     public final void mEND() throws RecognitionException {
         try {
             int _type = END;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1848:9: ( 'end' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1848:11: 'end'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1867:9: ( 'end' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1867:11: 'end'
             {
             match("end"); if (failed) return ;
 
@@ -1922,8 +1943,8 @@
     public final void mID() throws RecognitionException {
         try {
             int _type = ID;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1851:2: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1851:4: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1870:2: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1870:4: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' | '\\u00c0' .. '\\u00ff' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
             {
             if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z')||(input.LA(1)>='\u00C0' && input.LA(1)<='\u00FF') ) {
                 input.consume();
@@ -1936,7 +1957,7 @@
                 recover(mse);    throw mse;
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1851:50: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1870:50: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | '\\u00c0' .. '\\u00ff' )*
             loop14:
             do {
                 int alt14=2;
@@ -1985,8 +2006,8 @@
     public final void mLEFT_PAREN() throws RecognitionException {
         try {
             int _type = LEFT_PAREN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1855:9: ( '(' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1855:11: '('
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1874:9: ( '(' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1874:11: '('
             {
             match('('); if (failed) return ;
 
@@ -2003,8 +2024,8 @@
     public final void mRIGHT_PAREN() throws RecognitionException {
         try {
             int _type = RIGHT_PAREN;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:9: ( ')' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1859:11: ')'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1878:9: ( ')' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1878:11: ')'
             {
             match(')'); if (failed) return ;
 
@@ -2021,8 +2042,8 @@
     public final void mLEFT_SQUARE() throws RecognitionException {
         try {
             int _type = LEFT_SQUARE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1863:9: ( '[' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1863:11: '['
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1882:9: ( '[' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1882:11: '['
             {
             match('['); if (failed) return ;
 
@@ -2039,8 +2060,8 @@
     public final void mRIGHT_SQUARE() throws RecognitionException {
         try {
             int _type = RIGHT_SQUARE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1867:9: ( ']' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1867:11: ']'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1886:9: ( ']' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1886:11: ']'
             {
             match(']'); if (failed) return ;
 
@@ -2057,8 +2078,8 @@
     public final void mLEFT_CURLY() throws RecognitionException {
         try {
             int _type = LEFT_CURLY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1871:9: ( '{' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1871:11: '{'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1890:9: ( '{' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1890:11: '{'
             {
             match('{'); if (failed) return ;
 
@@ -2075,8 +2096,8 @@
     public final void mRIGHT_CURLY() throws RecognitionException {
         try {
             int _type = RIGHT_CURLY;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1875:9: ( '}' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1875:11: '}'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1894:9: ( '}' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1894:11: '}'
             {
             match('}'); if (failed) return ;
 
@@ -2093,8 +2114,8 @@
     public final void mCOMMA() throws RecognitionException {
         try {
             int _type = COMMA;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1878:7: ( ',' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1878:9: ','
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1897:7: ( ',' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1897:9: ','
             {
             match(','); if (failed) return ;
 
@@ -2111,8 +2132,8 @@
     public final void mDOT() throws RecognitionException {
         try {
             int _type = DOT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1881:5: ( '.' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1881:7: '.'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1900:5: ( '.' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1900:7: '.'
             {
             match('.'); if (failed) return ;
 
@@ -2129,8 +2150,8 @@
     public final void mDOUBLE_AMPER() throws RecognitionException {
         try {
             int _type = DOUBLE_AMPER;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1885:2: ( '&&' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1885:4: '&&'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:2: ( '&&' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:4: '&&'
             {
             match("&&"); if (failed) return ;
 
@@ -2148,8 +2169,8 @@
     public final void mDOUBLE_PIPE() throws RecognitionException {
         try {
             int _type = DOUBLE_PIPE;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1889:2: ( '||' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1889:4: '||'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1908:2: ( '||' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1908:4: '||'
             {
             match("||"); if (failed) return ;
 
@@ -2163,15 +2184,33 @@
     }
     // $ANTLR end DOUBLE_PIPE
 
+    // $ANTLR start TILDE
+    public final void mTILDE() throws RecognitionException {
+        try {
+            int _type = TILDE;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1911:7: ( '~' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1911:9: '~'
+            {
+            match('~'); if (failed) return ;
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end TILDE
+
     // $ANTLR start SH_STYLE_SINGLE_LINE_COMMENT
     public final void mSH_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
         try {
             int _type = SH_STYLE_SINGLE_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:2: ( '#' ( options {greedy=false; } : . )* EOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:4: '#' ( options {greedy=false; } : . )* EOL
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:2: ( '#' ( options {greedy=false; } : . )* EOL )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:4: '#' ( options {greedy=false; } : . )* EOL
             {
             match('#'); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:8: ( options {greedy=false; } : . )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:8: ( options {greedy=false; } : . )*
             loop15:
             do {
                 int alt15=2;
@@ -2190,7 +2229,7 @@
 
                 switch (alt15) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1893:35: .
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1914:35: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2220,12 +2259,12 @@
     public final void mC_STYLE_SINGLE_LINE_COMMENT() throws RecognitionException {
         try {
             int _type = C_STYLE_SINGLE_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:2: ( '//' ( options {greedy=false; } : . )* EOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:4: '//' ( options {greedy=false; } : . )* EOL
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:2: ( '//' ( options {greedy=false; } : . )* EOL )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:4: '//' ( options {greedy=false; } : . )* EOL
             {
             match("//"); if (failed) return ;
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:9: ( options {greedy=false; } : . )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:9: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -2244,7 +2283,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1899:36: .
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1920:36: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2274,12 +2313,12 @@
     public final void mMULTI_LINE_COMMENT() throws RecognitionException {
         try {
             int _type = MULTI_LINE_COMMENT;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:2: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:4: '/*' ( options {greedy=false; } : . )* '*/'
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1925:2: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1925:4: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); if (failed) return ;
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:9: ( options {greedy=false; } : . )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1925:9: ( options {greedy=false; } : . )*
             loop17:
             do {
                 int alt17=2;
@@ -2304,7 +2343,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1904:35: .
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1925:35: .
             	    {
             	    matchAny(); if (failed) return ;
 
@@ -2335,7 +2374,7 @@
     public final void mMISC() throws RecognitionException {
         try {
             int _type = MISC;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1908:7: ( '!' | '@' | '$' | '%' | '^' | '*' | '_' | '-' | '+' | '?' | '=' | '/' | '\\'' | '\\\\' | '|' | '&' )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1929:7: ( '!' | '@' | '$' | '%' | '^' | '*' | '_' | '-' | '+' | '?' | '=' | '/' | '\\'' | '\\\\' | '|' | '&' )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
             {
             if ( input.LA(1)=='!'||(input.LA(1)>='$' && input.LA(1)<='\'')||(input.LA(1)>='*' && input.LA(1)<='+')||input.LA(1)=='-'||input.LA(1)=='/'||input.LA(1)=='='||(input.LA(1)>='?' && input.LA(1)<='@')||input.LA(1)=='\\'||(input.LA(1)>='^' && input.LA(1)<='_')||input.LA(1)=='|' ) {
@@ -2360,77 +2399,77 @@
     // $ANTLR end MISC
 
     public void mTokens() throws RecognitionException {
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:8: ( T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | GLOBAL | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC )
-        int alt18=73;
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:8: ( T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | EVENT | GLOBAL | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | TILDE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC )
+        int alt18=75;
         alt18 = dfa18.predict(input);
         switch (alt18) {
             case 1 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:10: T72
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:10: T74
                 {
-                mT72(); if (failed) return ;
+                mT74(); if (failed) return ;
 
                 }
                 break;
             case 2 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:14: T73
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:14: T75
                 {
-                mT73(); if (failed) return ;
+                mT75(); if (failed) return ;
 
                 }
                 break;
             case 3 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:18: T74
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:18: T76
                 {
-                mT74(); if (failed) return ;
+                mT76(); if (failed) return ;
 
                 }
                 break;
             case 4 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:22: T75
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:22: T77
                 {
-                mT75(); if (failed) return ;
+                mT77(); if (failed) return ;
 
                 }
                 break;
             case 5 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:26: T76
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:26: T78
                 {
-                mT76(); if (failed) return ;
+                mT78(); if (failed) return ;
 
                 }
                 break;
             case 6 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:30: T77
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:30: T79
                 {
-                mT77(); if (failed) return ;
+                mT79(); if (failed) return ;
 
                 }
                 break;
             case 7 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:34: T78
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:34: T80
                 {
-                mT78(); if (failed) return ;
+                mT80(); if (failed) return ;
 
                 }
                 break;
             case 8 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:38: T79
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:38: T81
                 {
-                mT79(); if (failed) return ;
+                mT81(); if (failed) return ;
 
                 }
                 break;
             case 9 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:42: T80
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:42: T82
                 {
-                mT80(); if (failed) return ;
+                mT82(); if (failed) return ;
 
                 }
                 break;
             case 10 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:46: T81
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:46: T83
                 {
-                mT81(); if (failed) return ;
+                mT83(); if (failed) return ;
 
                 }
                 break;
@@ -2491,386 +2530,400 @@
                 }
                 break;
             case 19 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:99: GLOBAL
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:99: EVENT
                 {
-                mGLOBAL(); if (failed) return ;
+                mEVENT(); if (failed) return ;
 
                 }
                 break;
             case 20 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:106: RULE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:105: GLOBAL
                 {
-                mRULE(); if (failed) return ;
+                mGLOBAL(); if (failed) return ;
 
                 }
                 break;
             case 21 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:111: QUERY
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:112: RULE
                 {
-                mQUERY(); if (failed) return ;
+                mRULE(); if (failed) return ;
 
                 }
                 break;
             case 22 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:117: TEMPLATE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:117: QUERY
                 {
-                mTEMPLATE(); if (failed) return ;
+                mQUERY(); if (failed) return ;
 
                 }
                 break;
             case 23 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:126: ATTRIBUTES
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:123: TEMPLATE
                 {
-                mATTRIBUTES(); if (failed) return ;
+                mTEMPLATE(); if (failed) return ;
 
                 }
                 break;
             case 24 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:137: DATE_EFFECTIVE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:132: ATTRIBUTES
                 {
-                mDATE_EFFECTIVE(); if (failed) return ;
+                mATTRIBUTES(); if (failed) return ;
 
                 }
                 break;
             case 25 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:152: DATE_EXPIRES
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:143: DATE_EFFECTIVE
                 {
-                mDATE_EXPIRES(); if (failed) return ;
+                mDATE_EFFECTIVE(); if (failed) return ;
 
                 }
                 break;
             case 26 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:165: ENABLED
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:158: DATE_EXPIRES
                 {
-                mENABLED(); if (failed) return ;
+                mDATE_EXPIRES(); if (failed) return ;
 
                 }
                 break;
             case 27 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:173: SALIENCE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:171: ENABLED
                 {
-                mSALIENCE(); if (failed) return ;
+                mENABLED(); if (failed) return ;
 
                 }
                 break;
             case 28 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:182: NO_LOOP
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:179: SALIENCE
                 {
-                mNO_LOOP(); if (failed) return ;
+                mSALIENCE(); if (failed) return ;
 
                 }
                 break;
             case 29 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:190: AUTO_FOCUS
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:188: NO_LOOP
                 {
-                mAUTO_FOCUS(); if (failed) return ;
+                mNO_LOOP(); if (failed) return ;
 
                 }
                 break;
             case 30 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:201: ACTIVATION_GROUP
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:196: AUTO_FOCUS
                 {
-                mACTIVATION_GROUP(); if (failed) return ;
+                mAUTO_FOCUS(); if (failed) return ;
 
                 }
                 break;
             case 31 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:218: AGENDA_GROUP
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:207: ACTIVATION_GROUP
                 {
-                mAGENDA_GROUP(); if (failed) return ;
+                mACTIVATION_GROUP(); if (failed) return ;
 
                 }
                 break;
             case 32 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:231: DIALECT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:224: AGENDA_GROUP
                 {
-                mDIALECT(); if (failed) return ;
+                mAGENDA_GROUP(); if (failed) return ;
 
                 }
                 break;
             case 33 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:239: RULEFLOW_GROUP
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:237: DIALECT
                 {
-                mRULEFLOW_GROUP(); if (failed) return ;
+                mDIALECT(); if (failed) return ;
 
                 }
                 break;
             case 34 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:254: DURATION
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:245: RULEFLOW_GROUP
                 {
-                mDURATION(); if (failed) return ;
+                mRULEFLOW_GROUP(); if (failed) return ;
 
                 }
                 break;
             case 35 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:263: LOCK_ON_ACTIVE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:260: DURATION
                 {
-                mLOCK_ON_ACTIVE(); if (failed) return ;
+                mDURATION(); if (failed) return ;
 
                 }
                 break;
             case 36 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:278: FROM
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:269: LOCK_ON_ACTIVE
                 {
-                mFROM(); if (failed) return ;
+                mLOCK_ON_ACTIVE(); if (failed) return ;
 
                 }
                 break;
             case 37 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:283: ACCUMULATE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:284: FROM
                 {
-                mACCUMULATE(); if (failed) return ;
+                mFROM(); if (failed) return ;
 
                 }
                 break;
             case 38 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:294: INIT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:289: ACCUMULATE
                 {
-                mINIT(); if (failed) return ;
+                mACCUMULATE(); if (failed) return ;
 
                 }
                 break;
             case 39 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:299: ACTION
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:300: INIT
                 {
-                mACTION(); if (failed) return ;
+                mINIT(); if (failed) return ;
 
                 }
                 break;
             case 40 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:306: REVERSE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:305: ACTION
                 {
-                mREVERSE(); if (failed) return ;
+                mACTION(); if (failed) return ;
 
                 }
                 break;
             case 41 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:314: RESULT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:312: REVERSE
                 {
-                mRESULT(); if (failed) return ;
+                mREVERSE(); if (failed) return ;
 
                 }
                 break;
             case 42 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:321: COLLECT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:320: RESULT
                 {
-                mCOLLECT(); if (failed) return ;
+                mRESULT(); if (failed) return ;
 
                 }
                 break;
             case 43 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:329: OR
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:327: COLLECT
                 {
-                mOR(); if (failed) return ;
+                mCOLLECT(); if (failed) return ;
 
                 }
                 break;
             case 44 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:332: AND
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:335: OR
                 {
-                mAND(); if (failed) return ;
+                mOR(); if (failed) return ;
 
                 }
                 break;
             case 45 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:336: CONTAINS
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:338: AND
                 {
-                mCONTAINS(); if (failed) return ;
+                mAND(); if (failed) return ;
 
                 }
                 break;
             case 46 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:345: EXCLUDES
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:342: CONTAINS
                 {
-                mEXCLUDES(); if (failed) return ;
+                mCONTAINS(); if (failed) return ;
 
                 }
                 break;
             case 47 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:354: MEMBEROF
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:351: EXCLUDES
                 {
-                mMEMBEROF(); if (failed) return ;
+                mEXCLUDES(); if (failed) return ;
 
                 }
                 break;
             case 48 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:363: MATCHES
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:360: MEMBEROF
                 {
-                mMATCHES(); if (failed) return ;
+                mMEMBEROF(); if (failed) return ;
 
                 }
                 break;
             case 49 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:371: SOUNDSLIKE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:369: MATCHES
                 {
-                mSOUNDSLIKE(); if (failed) return ;
+                mMATCHES(); if (failed) return ;
 
                 }
                 break;
             case 50 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:382: IN
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:377: SOUNDSLIKE
                 {
-                mIN(); if (failed) return ;
+                mSOUNDSLIKE(); if (failed) return ;
 
                 }
                 break;
             case 51 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:385: NULL
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:388: IN
                 {
-                mNULL(); if (failed) return ;
+                mIN(); if (failed) return ;
 
                 }
                 break;
             case 52 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:390: EXISTS
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:391: NULL
                 {
-                mEXISTS(); if (failed) return ;
+                mNULL(); if (failed) return ;
 
                 }
                 break;
             case 53 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:397: NOT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:396: EXISTS
                 {
-                mNOT(); if (failed) return ;
+                mEXISTS(); if (failed) return ;
 
                 }
                 break;
             case 54 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:401: EVAL
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:403: NOT
                 {
-                mEVAL(); if (failed) return ;
+                mNOT(); if (failed) return ;
 
                 }
                 break;
             case 55 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:406: FORALL
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:407: EVAL
                 {
-                mFORALL(); if (failed) return ;
+                mEVAL(); if (failed) return ;
 
                 }
                 break;
             case 56 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:413: WHEN
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:412: FORALL
                 {
-                mWHEN(); if (failed) return ;
+                mFORALL(); if (failed) return ;
 
                 }
                 break;
             case 57 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:418: THEN
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:419: WHEN
                 {
-                mTHEN(); if (failed) return ;
+                mWHEN(); if (failed) return ;
 
                 }
                 break;
             case 58 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:423: END
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:424: THEN
                 {
-                mEND(); if (failed) return ;
+                mTHEN(); if (failed) return ;
 
                 }
                 break;
             case 59 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:427: ID
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:429: END
                 {
-                mID(); if (failed) return ;
+                mEND(); if (failed) return ;
 
                 }
                 break;
             case 60 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:430: LEFT_PAREN
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:433: ID
                 {
-                mLEFT_PAREN(); if (failed) return ;
+                mID(); if (failed) return ;
 
                 }
                 break;
             case 61 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:441: RIGHT_PAREN
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:436: LEFT_PAREN
                 {
-                mRIGHT_PAREN(); if (failed) return ;
+                mLEFT_PAREN(); if (failed) return ;
 
                 }
                 break;
             case 62 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:453: LEFT_SQUARE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:447: RIGHT_PAREN
                 {
-                mLEFT_SQUARE(); if (failed) return ;
+                mRIGHT_PAREN(); if (failed) return ;
 
                 }
                 break;
             case 63 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:465: RIGHT_SQUARE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:459: LEFT_SQUARE
                 {
-                mRIGHT_SQUARE(); if (failed) return ;
+                mLEFT_SQUARE(); if (failed) return ;
 
                 }
                 break;
             case 64 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:478: LEFT_CURLY
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:471: RIGHT_SQUARE
                 {
-                mLEFT_CURLY(); if (failed) return ;
+                mRIGHT_SQUARE(); if (failed) return ;
 
                 }
                 break;
             case 65 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:489: RIGHT_CURLY
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:484: LEFT_CURLY
                 {
-                mRIGHT_CURLY(); if (failed) return ;
+                mLEFT_CURLY(); if (failed) return ;
 
                 }
                 break;
             case 66 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:501: COMMA
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:495: RIGHT_CURLY
                 {
-                mCOMMA(); if (failed) return ;
+                mRIGHT_CURLY(); if (failed) return ;
 
                 }
                 break;
             case 67 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:507: DOT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:507: COMMA
                 {
-                mDOT(); if (failed) return ;
+                mCOMMA(); if (failed) return ;
 
                 }
                 break;
             case 68 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:511: DOUBLE_AMPER
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:513: DOT
                 {
-                mDOUBLE_AMPER(); if (failed) return ;
+                mDOT(); if (failed) return ;
 
                 }
                 break;
             case 69 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:524: DOUBLE_PIPE
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:517: DOUBLE_AMPER
                 {
-                mDOUBLE_PIPE(); if (failed) return ;
+                mDOUBLE_AMPER(); if (failed) return ;
 
                 }
                 break;
             case 70 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:536: SH_STYLE_SINGLE_LINE_COMMENT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:530: DOUBLE_PIPE
                 {
-                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+                mDOUBLE_PIPE(); if (failed) return ;
 
                 }
                 break;
             case 71 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:565: C_STYLE_SINGLE_LINE_COMMENT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:542: TILDE
                 {
-                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+                mTILDE(); if (failed) return ;
 
                 }
                 break;
             case 72 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:593: MULTI_LINE_COMMENT
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:548: SH_STYLE_SINGLE_LINE_COMMENT
                 {
-                mMULTI_LINE_COMMENT(); if (failed) return ;
+                mSH_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
 
                 }
                 break;
             case 73 :
-                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:612: MISC
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:577: C_STYLE_SINGLE_LINE_COMMENT
                 {
+                mC_STYLE_SINGLE_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 74 :
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:605: MULTI_LINE_COMMENT
+                {
+                mMULTI_LINE_COMMENT(); if (failed) return ;
+
+                }
+                break;
+            case 75 :
+                // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1:624: MISC
+                {
                 mMISC(); if (failed) return ;
 
                 }
@@ -2882,8 +2935,8 @@
 
     // $ANTLR start synpred1
     public final void synpred1_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:14: ( '\\r\\n' )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1702:16: '\\r\\n'
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:14: ( '\\r\\n' )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1719:16: '\\r\\n'
         {
         match("\r\n"); if (failed) return ;
 
@@ -2910,124 +2963,127 @@
 
     protected DFA18 dfa18 = new DFA18(this);
     static final String DFA18_eotS =
-        "\2\uffff\1\55\1\uffff\2\53\1\61\1\63\1\53\1\uffff\1\66\1\uffff\1"+
-        "\53\21\52\10\uffff\2\53\1\uffff\1\53\15\uffff\10\52\1\147\26\52"+
-        "\1\u0084\3\52\4\uffff\11\52\1\uffff\10\52\1\u0099\12\52\1\u00a4"+
-        "\3\52\1\uffff\1\u00a8\3\52\1\uffff\3\52\1\u00af\1\u00b0\2\52\1\u00b3"+
-        "\3\52\1\u00b7\4\52\1\u00bd\3\52\1\uffff\10\52\1\u00ca\1\52\1\uffff"+
-        "\2\52\1\u00ce\1\uffff\5\52\1\u00d4\2\uffff\2\52\1\uffff\1\52\1\u00af"+
-        "\1\52\1\uffff\5\52\1\uffff\1\u00de\4\52\1\uffff\2\52\1\uffff\3\52"+
-        "\1\uffff\3\52\2\uffff\4\52\1\uffff\1\52\1\u00f1\2\52\1\u00f4\1\u00f5"+
-        "\1\52\1\u00f7\1\52\1\uffff\2\52\1\u00fb\3\52\1\uffff\2\52\1\u0103"+
-        "\10\52\1\uffff\1\52\1\u010d\2\uffff\1\u010e\1\uffff\3\52\2\uffff"+
-        "\1\52\1\u0113\2\uffff\2\52\1\uffff\1\u0116\3\52\1\u011a\1\u011b"+
-        "\1\52\1\u011d\1\u011e\2\uffff\4\52\1\uffff\1\u0123\1\u0124\1\uffff"+
-        "\1\52\1\u0126\1\u0127\2\uffff\1\u0128\3\uffff\3\52\2\uffff\1\52"+
-        "\3\uffff\1\u012d\1\52\1\u012f\1\u0130\4\uffff";
+        "\2\uffff\1\56\1\uffff\2\54\1\62\1\64\1\54\1\uffff\1\67\1\uffff\1"+
+        "\54\21\53\10\uffff\2\54\2\uffff\1\54\15\uffff\10\53\1\150\26\53"+
+        "\1\u0086\3\53\4\uffff\11\53\1\uffff\5\53\1\u0098\11\53\1\u00a2\10"+
+        "\53\1\uffff\1\u00ab\3\53\1\uffff\3\53\1\u00b2\1\u00b3\1\53\1\u00b5"+
+        "\4\53\1\u00ba\3\53\1\u00be\1\53\1\uffff\4\53\1\u00c5\4\53\1\uffff"+
+        "\7\53\1\u00d2\1\uffff\5\53\1\u00d8\2\uffff\1\53\1\uffff\1\53\1\u00b2"+
+        "\2\53\1\uffff\3\53\1\uffff\1\u00e0\5\53\1\uffff\1\u00e6\4\53\1\uffff"+
+        "\2\53\1\uffff\3\53\2\uffff\4\53\1\uffff\1\53\1\u00f6\2\53\1\u00f9"+
+        "\1\53\1\u00fb\1\uffff\1\53\1\u00fd\1\53\1\u00ff\1\53\1\uffff\1\u0101"+
+        "\5\53\1\uffff\10\53\1\uffff\1\53\1\u0112\1\uffff\1\53\1\uffff\1"+
+        "\u0114\1\uffff\1\u0115\1\uffff\1\53\1\uffff\3\53\1\uffff\1\53\2"+
+        "\uffff\1\u011b\3\53\1\u011f\1\u0120\1\53\1\u0122\1\u0123\1\uffff"+
+        "\1\u0124\2\uffff\4\53\1\u0129\1\uffff\1\u012a\1\53\1\u012c\2\uffff"+
+        "\1\u012d\4\uffff\3\53\2\uffff\1\53\2\uffff\1\53\1\u0133\1\u0134"+
+        "\1\u0135\4\uffff";
     static final String DFA18_eofS =
-        "\u0131\uffff";
+        "\u0136\uffff";
     static final String DFA18_minS =
         "\1\11\1\uffff\1\52\1\uffff\1\60\4\75\1\uffff\1\56\1\uffff\1\0\1"+
-        "\145\2\141\1\155\1\154\1\145\1\165\1\143\1\141\1\156\1\141\3\157"+
-        "\1\162\1\141\1\150\10\uffff\1\46\1\174\1\uffff\1\52\15\uffff\1\165"+
-        "\1\145\1\155\1\162\1\157\1\156\1\154\1\143\1\60\1\160\1\157\1\163"+
-        "\1\154\1\145\1\143\1\144\1\145\2\164\1\141\1\164\1\162\1\143\2\141"+
-        "\1\165\2\154\1\55\1\143\1\154\1\60\1\164\1\155\1\145\4\uffff\1\145"+
-        "\1\156\1\160\1\141\1\155\1\143\1\163\1\153\1\164\1\uffff\1\157\1"+
-        "\142\1\145\1\165\1\145\1\162\1\165\1\151\1\60\1\156\1\157\1\162"+
-        "\1\154\1\145\1\141\1\154\1\163\1\154\1\142\1\60\1\156\1\151\1\154"+
-        "\1\uffff\1\60\1\153\1\164\1\154\1\uffff\1\143\1\142\1\156\2\60\2"+
-        "\154\1\60\1\164\1\145\1\141\1\60\1\162\1\141\1\162\1\154\1\60\1"+
-        "\171\1\155\1\157\1\uffff\1\144\1\55\1\151\1\145\1\55\1\164\1\165"+
-        "\1\164\1\60\1\154\1\uffff\1\144\1\145\1\60\1\uffff\1\55\1\141\1"+
-        "\145\1\150\1\145\1\60\2\uffff\1\141\1\154\1\uffff\1\151\1\60\1\147"+
-        "\1\uffff\1\164\1\154\1\163\1\164\1\154\1\uffff\1\60\1\165\1\141"+
-        "\1\156\1\141\1\uffff\1\142\1\143\1\145\1\151\1\144\1\163\1\uffff"+
-        "\1\145\1\163\1\156\2\uffff\1\151\1\143\1\145\1\162\1\uffff\1\164"+
-        "\1\60\1\157\1\145\2\60\1\145\1\60\1\157\1\uffff\1\154\1\164\1\60"+
-        "\1\55\1\165\1\164\1\146\1\157\1\145\1\60\1\144\1\154\1\143\1\156"+
-        "\1\164\1\163\1\117\1\145\1\uffff\1\156\1\60\2\uffff\1\60\1\uffff"+
-        "\1\167\1\141\1\151\2\uffff\1\164\1\60\2\uffff\1\156\1\163\1\uffff"+
-        "\1\60\1\151\1\145\1\163\2\60\1\146\2\60\2\uffff\1\55\1\164\1\157"+
-        "\1\145\1\uffff\2\60\1\uffff\1\153\2\60\2\uffff\1\60\3\uffff\1\145"+
-        "\1\156\1\163\2\uffff\1\145\3\uffff\1\60\1\55\2\60\4\uffff";
+        "\145\2\141\1\155\1\156\1\154\1\145\1\165\1\143\2\141\3\157\1\162"+
+        "\1\141\1\150\10\uffff\1\46\1\174\2\uffff\1\52\15\uffff\1\165\1\145"+
+        "\1\155\1\157\1\162\1\154\1\156\1\143\1\60\1\160\1\143\2\141\1\157"+
+        "\1\163\1\154\1\145\1\143\1\164\1\144\1\164\1\145\1\162\1\164\1\141"+
+        "\1\154\1\165\1\154\1\55\1\143\1\154\1\60\1\164\1\155\1\145\4\uffff"+
+        "\1\145\1\156\1\160\1\155\1\141\1\163\1\143\1\153\1\164\1\uffff\1"+
+        "\157\1\154\1\163\1\154\1\156\1\60\2\142\1\145\1\165\1\145\1\162"+
+        "\1\151\1\165\1\162\1\60\1\157\1\156\1\141\1\145\1\154\1\151\1\156"+
+        "\1\154\1\uffff\1\60\1\153\1\164\1\154\1\uffff\1\143\1\142\1\156"+
+        "\2\60\1\154\1\60\1\154\1\145\1\164\1\141\1\60\1\162\1\165\1\164"+
+        "\1\60\1\164\1\uffff\1\154\1\141\1\162\1\154\1\60\1\171\1\157\1\155"+
+        "\1\151\1\uffff\1\55\1\144\1\164\1\55\2\145\1\144\1\60\1\uffff\1"+
+        "\55\1\141\1\145\1\150\1\145\1\60\2\uffff\1\141\1\uffff\1\154\1\60"+
+        "\1\151\1\147\1\uffff\1\164\1\144\1\163\1\uffff\1\60\1\145\1\154"+
+        "\1\163\1\164\1\154\1\uffff\1\60\1\156\1\141\1\165\1\142\1\uffff"+
+        "\1\141\1\151\1\145\1\143\1\156\1\163\2\uffff\1\151\1\143\1\145\1"+
+        "\162\1\uffff\1\164\1\60\1\157\1\145\1\60\1\145\1\60\1\uffff\1\144"+
+        "\1\60\1\145\1\60\1\157\1\uffff\1\60\1\164\1\154\1\165\1\55\1\157"+
+        "\1\146\1\164\1\143\1\154\1\156\1\164\1\163\1\117\1\145\1\uffff\1"+
+        "\156\1\60\1\uffff\1\163\1\uffff\1\60\1\uffff\1\60\1\uffff\1\167"+
+        "\1\uffff\1\151\1\141\1\164\1\uffff\1\156\2\uffff\1\60\1\145\1\151"+
+        "\1\163\2\60\1\146\2\60\1\uffff\1\60\2\uffff\1\55\1\157\1\164\1\145"+
+        "\1\60\1\uffff\1\60\1\153\1\60\2\uffff\1\60\4\uffff\1\156\1\145\1"+
+        "\163\2\uffff\1\145\2\uffff\1\55\3\60\4\uffff";
     static final String DFA18_maxS =
         "\1\u00ff\1\uffff\1\52\1\uffff\1\76\4\75\1\uffff\1\71\1\uffff\1\ufffe"+
-        "\1\162\1\165\1\141\1\156\1\154\4\165\1\170\1\157\1\165\2\157\1\162"+
-        "\1\145\1\150\10\uffff\1\46\1\174\1\uffff\1\57\15\uffff\1\165\1\145"+
-        "\1\155\1\162\1\157\1\156\1\154\1\143\1\u00ff\1\160\1\157\1\166\1"+
-        "\154\1\145\1\164\1\144\1\145\2\164\1\141\1\164\1\162\1\151\1\141"+
-        "\1\144\1\165\2\154\1\164\1\143\1\156\1\u00ff\1\164\1\155\1\145\4"+
-        "\uffff\1\145\1\156\1\160\1\141\1\155\1\143\1\163\1\153\1\164\1\uffff"+
-        "\1\157\1\142\1\145\1\165\1\145\1\162\1\165\1\151\1\u00ff\1\156\1"+
-        "\157\1\162\1\154\1\145\1\141\1\154\1\163\1\154\1\142\1\u00ff\1\156"+
-        "\1\151\1\154\1\uffff\1\u00ff\1\153\1\164\1\154\1\uffff\1\143\1\142"+
-        "\1\156\2\u00ff\2\154\1\u00ff\1\164\1\145\1\141\1\u00ff\1\162\1\141"+
-        "\1\162\1\154\1\u00ff\1\171\1\155\1\166\1\uffff\1\144\1\55\1\151"+
-        "\1\145\1\55\1\164\1\165\1\164\1\u00ff\1\154\1\uffff\1\144\1\145"+
-        "\1\u00ff\1\uffff\1\55\1\141\1\145\1\150\1\145\1\u00ff\2\uffff\1"+
-        "\141\1\154\1\uffff\1\151\1\u00ff\1\147\1\uffff\1\164\1\154\1\163"+
-        "\1\164\1\154\1\uffff\1\u00ff\1\165\1\141\1\156\1\141\1\uffff\1\142"+
-        "\1\143\1\145\1\151\1\144\1\163\1\uffff\1\145\1\163\1\156\2\uffff"+
-        "\1\151\1\143\1\145\1\162\1\uffff\1\164\1\u00ff\1\157\1\145\2\u00ff"+
-        "\1\145\1\u00ff\1\157\1\uffff\1\154\1\164\1\u00ff\1\55\1\165\1\164"+
-        "\1\170\1\157\1\145\1\u00ff\1\144\1\154\1\143\1\156\1\164\1\163\1"+
-        "\117\1\145\1\uffff\1\156\1\u00ff\2\uffff\1\u00ff\1\uffff\1\167\1"+
-        "\141\1\151\2\uffff\1\164\1\u00ff\2\uffff\1\156\1\163\1\uffff\1\u00ff"+
-        "\1\151\1\145\1\163\2\u00ff\1\146\2\u00ff\2\uffff\1\55\1\164\1\157"+
-        "\1\145\1\uffff\2\u00ff\1\uffff\1\153\2\u00ff\2\uffff\1\u00ff\3\uffff"+
-        "\1\145\1\156\1\163\2\uffff\1\145\3\uffff\1\u00ff\1\55\2\u00ff\4"+
-        "\uffff";
+        "\1\162\1\165\1\141\1\156\1\170\1\154\4\165\1\157\1\165\2\157\1\162"+
+        "\1\145\1\150\10\uffff\1\46\1\174\2\uffff\1\57\15\uffff\1\165\1\145"+
+        "\1\155\1\157\1\162\1\154\1\156\1\143\1\u00ff\1\160\1\151\1\145\1"+
+        "\144\1\157\1\166\1\154\1\145\2\164\1\144\1\164\1\145\1\162\1\164"+
+        "\1\141\1\154\1\165\1\154\1\164\1\143\1\156\1\u00ff\1\164\1\155\1"+
+        "\145\4\uffff\1\145\1\156\1\160\1\155\1\141\1\163\1\143\1\153\1\164"+
+        "\1\uffff\1\157\1\154\1\163\1\154\1\156\1\u00ff\2\142\1\145\1\165"+
+        "\1\145\1\162\1\151\1\165\1\162\1\u00ff\1\157\1\156\1\141\1\145\1"+
+        "\154\1\151\1\156\1\154\1\uffff\1\u00ff\1\153\1\164\1\154\1\uffff"+
+        "\1\143\1\142\1\156\2\u00ff\1\154\1\u00ff\1\154\1\145\1\164\1\141"+
+        "\1\u00ff\1\162\1\165\1\164\1\u00ff\1\164\1\uffff\1\154\1\141\1\162"+
+        "\1\154\1\u00ff\1\171\1\166\1\155\1\151\1\uffff\1\55\1\144\1\164"+
+        "\1\55\2\145\1\144\1\u00ff\1\uffff\1\55\1\141\1\145\1\150\1\145\1"+
+        "\u00ff\2\uffff\1\141\1\uffff\1\154\1\u00ff\1\151\1\147\1\uffff\1"+
+        "\164\1\144\1\163\1\uffff\1\u00ff\1\145\1\154\1\163\1\164\1\154\1"+
+        "\uffff\1\u00ff\1\156\1\141\1\165\1\142\1\uffff\1\141\1\151\1\145"+
+        "\1\143\1\156\1\163\2\uffff\1\151\1\143\1\145\1\162\1\uffff\1\164"+
+        "\1\u00ff\1\157\1\145\1\u00ff\1\145\1\u00ff\1\uffff\1\144\1\u00ff"+
+        "\1\145\1\u00ff\1\157\1\uffff\1\u00ff\1\164\1\154\1\165\1\55\1\157"+
+        "\1\170\1\164\1\143\1\154\1\156\1\164\1\163\1\117\1\145\1\uffff\1"+
+        "\156\1\u00ff\1\uffff\1\163\1\uffff\1\u00ff\1\uffff\1\u00ff\1\uffff"+
+        "\1\167\1\uffff\1\151\1\141\1\164\1\uffff\1\156\2\uffff\1\u00ff\1"+
+        "\145\1\151\1\163\2\u00ff\1\146\2\u00ff\1\uffff\1\u00ff\2\uffff\1"+
+        "\55\1\157\1\164\1\145\1\u00ff\1\uffff\1\u00ff\1\153\1\u00ff\2\uffff"+
+        "\1\u00ff\4\uffff\1\156\1\145\1\163\2\uffff\1\145\2\uffff\1\55\3"+
+        "\u00ff\4\uffff";
     static final String DFA18_acceptS =
-        "\1\uffff\1\1\1\uffff\1\3\5\uffff\1\13\1\uffff\1\16\22\uffff\1\73"+
-        "\1\74\1\75\1\76\1\77\1\100\1\101\1\102\2\uffff\1\106\1\uffff\1\73"+
-        "\1\111\1\2\1\103\1\4\1\5\1\7\1\6\1\11\1\10\1\12\1\15\1\14\43\uffff"+
-        "\1\104\1\105\1\110\1\107\11\uffff\1\62\27\uffff\1\34\4\uffff\1\53"+
-        "\24\uffff\1\54\12\uffff\1\72\3\uffff\1\65\6\uffff\1\17\1\71\2\uffff"+
-        "\1\44\3\uffff\1\46\5\uffff\1\24\5\uffff\1\35\6\uffff\1\66\3\uffff"+
-        "\1\63\1\43\4\uffff\1\70\11\uffff\1\25\22\uffff\1\67\2\uffff\1\21"+
-        "\1\23\1\uffff\1\51\3\uffff\1\47\1\37\2\uffff\1\30\1\31\2\uffff\1"+
-        "\64\11\uffff\1\20\1\50\4\uffff\1\40\2\uffff\1\32\3\uffff\1\52\1"+
-        "\60\1\uffff\1\26\1\22\1\41\3\uffff\1\42\1\56\1\uffff\1\33\1\55\1"+
-        "\57\4\uffff\1\45\1\36\1\27\1\61";
+        "\1\uffff\1\1\1\uffff\1\3\5\uffff\1\13\1\uffff\1\16\22\uffff\1\74"+
+        "\1\75\1\76\1\77\1\100\1\101\1\102\1\103\2\uffff\1\107\1\110\1\uffff"+
+        "\1\74\1\113\1\2\1\104\1\4\1\5\1\7\1\6\1\11\1\10\1\12\1\15\1\14\43"+
+        "\uffff\1\105\1\106\1\111\1\112\11\uffff\1\63\30\uffff\1\35\4\uffff"+
+        "\1\54\21\uffff\1\73\11\uffff\1\55\10\uffff\1\66\6\uffff\1\17\1\72"+
+        "\1\uffff\1\45\4\uffff\1\47\3\uffff\1\67\6\uffff\1\25\5\uffff\1\36"+
+        "\6\uffff\1\64\1\44\4\uffff\1\71\7\uffff\1\23\5\uffff\1\26\17\uffff"+
+        "\1\70\2\uffff\1\21\1\uffff\1\65\1\uffff\1\24\1\uffff\1\52\1\uffff"+
+        "\1\50\3\uffff\1\40\1\uffff\1\31\1\32\11\uffff\1\20\1\uffff\1\33"+
+        "\1\51\5\uffff\1\41\3\uffff\1\53\1\61\1\uffff\1\27\1\22\1\57\1\42"+
+        "\3\uffff\1\43\1\34\1\uffff\1\56\1\60\4\uffff\1\37\1\46\1\30\1\62";
     static final String DFA18_specialS =
-        "\u0131\uffff}>";
+        "\u0136\uffff}>";
     static final String[] DFA18_transitionS = {
-            "\2\11\1\uffff\2\11\22\uffff\1\11\1\10\1\13\1\50\1\36\1\53\1"+
-            "\46\1\14\1\37\1\40\2\53\1\45\1\4\1\2\1\51\12\12\1\3\1\1\1\7"+
-            "\1\5\1\6\2\53\32\52\1\41\1\53\1\42\1\53\1\36\1\uffff\1\24\1"+
-            "\52\1\32\1\25\1\26\1\16\1\21\1\52\1\20\2\52\1\31\1\34\1\30\1"+
-            "\33\1\17\1\23\1\22\1\27\1\15\2\52\1\35\3\52\1\43\1\47\1\44\102"+
-            "\uffff\100\52",
+            "\2\11\1\uffff\2\11\22\uffff\1\11\1\10\1\13\1\51\1\36\1\54\1"+
+            "\46\1\14\1\37\1\40\2\54\1\45\1\4\1\2\1\52\12\12\1\3\1\1\1\7"+
+            "\1\5\1\6\2\54\32\53\1\41\1\54\1\42\1\54\1\36\1\uffff\1\25\1"+
+            "\53\1\32\1\26\1\21\1\16\1\22\1\53\1\20\2\53\1\31\1\34\1\30\1"+
+            "\33\1\17\1\24\1\23\1\27\1\15\2\53\1\35\3\53\1\43\1\47\1\44\1"+
+            "\50\101\uffff\100\53",
             "",
-            "\1\54",
+            "\1\55",
             "",
-            "\12\12\4\uffff\1\56",
-            "\1\57",
+            "\12\12\4\uffff\1\57",
             "\1\60",
-            "\1\62",
-            "\1\64",
+            "\1\61",
+            "\1\63",
+            "\1\65",
             "",
-            "\1\65\1\uffff\12\12",
+            "\1\66\1\uffff\12\12",
             "",
             "\uffff\13",
-            "\1\71\2\uffff\1\70\11\uffff\1\67",
-            "\1\75\15\uffff\1\72\2\uffff\1\73\2\uffff\1\74",
-            "\1\76",
-            "\1\100\1\77",
-            "\1\101",
-            "\1\102\17\uffff\1\103",
-            "\1\104",
-            "\1\105\3\uffff\1\107\6\uffff\1\106\5\uffff\1\111\1\110",
-            "\1\113\7\uffff\1\112\13\uffff\1\114",
-            "\1\117\7\uffff\1\116\1\uffff\1\115",
-            "\1\121\15\uffff\1\120",
-            "\1\123\5\uffff\1\122",
-            "\1\124",
+            "\1\72\2\uffff\1\71\11\uffff\1\70",
+            "\1\75\15\uffff\1\74\2\uffff\1\73\2\uffff\1\76",
+            "\1\77",
+            "\1\101\1\100",
+            "\1\104\7\uffff\1\103\1\uffff\1\102",
+            "\1\105",
+            "\1\106\17\uffff\1\107",
+            "\1\110",
+            "\1\111\3\uffff\1\115\6\uffff\1\113\5\uffff\1\112\1\114",
+            "\1\117\7\uffff\1\120\13\uffff\1\116",
+            "\1\121\15\uffff\1\122",
+            "\1\124\5\uffff\1\123",
             "\1\125",
             "\1\126",
-            "\1\127\3\uffff\1\130",
-            "\1\131",
+            "\1\127",
+            "\1\130\3\uffff\1\131",
+            "\1\132",
             "",
             "",
             "",
@@ -3036,11 +3092,11 @@
             "",
             "",
             "",
-            "\1\132",
             "\1\133",
+            "\1\134",
             "",
-            "\1\134\4\uffff\1\135",
             "",
+            "\1\136\4\uffff\1\135",
             "",
             "",
             "",
@@ -3053,7 +3109,7 @@
             "",
             "",
             "",
-            "\1\136",
+            "",
             "\1\137",
             "\1\140",
             "\1\141",
@@ -3061,41 +3117,40 @@
             "\1\143",
             "\1\144",
             "\1\145",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\10\52\1\146\21\52"+
-            "\105\uffff\100\52",
-            "\1\150",
+            "\1\146",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\10\53\1\147\21\53"+
+            "\105\uffff\100\53",
             "\1\151",
-            "\1\153\2\uffff\1\152",
-            "\1\154",
-            "\1\155",
-            "\1\156\20\uffff\1\157",
+            "\1\152\5\uffff\1\153",
+            "\1\154\3\uffff\1\155",
+            "\1\157\2\uffff\1\156",
             "\1\160",
-            "\1\161",
-            "\1\162",
+            "\1\162\2\uffff\1\161",
             "\1\163",
             "\1\164",
-            "\1\165",
-            "\1\166",
-            "\1\167\5\uffff\1\170",
+            "\1\166\20\uffff\1\165",
+            "\1\167",
+            "\1\170",
             "\1\171",
-            "\1\172\2\uffff\1\173",
+            "\1\172",
+            "\1\173",
             "\1\174",
             "\1\175",
             "\1\176",
-            "\1\177\106\uffff\1\u0080",
-            "\1\u0081",
-            "\1\u0083\1\uffff\1\u0082",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u0085",
-            "\1\u0086",
+            "\1\177",
+            "\1\u0080",
+            "\1\u0081\106\uffff\1\u0082",
+            "\1\u0083",
+            "\1\u0085\1\uffff\1\u0084",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u0087",
+            "\1\u0088",
+            "\1\u0089",
             "",
             "",
             "",
             "",
-            "\1\u0088",
-            "\1\u0089",
             "\1\u008a",
             "\1\u008b",
             "\1\u008c",
@@ -3103,17 +3158,17 @@
             "\1\u008e",
             "\1\u008f",
             "\1\u0090",
-            "",
             "\1\u0091",
             "\1\u0092",
+            "",
             "\1\u0093",
             "\1\u0094",
             "\1\u0095",
             "\1\u0096",
             "\1\u0097",
-            "\1\u0098",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u0099",
             "\1\u009a",
             "\1\u009b",
             "\1\u009c",
@@ -3122,223 +3177,230 @@
             "\1\u009f",
             "\1\u00a0",
             "\1\u00a1",
-            "\1\u00a2",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00a3",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u00a4",
             "\1\u00a5",
             "\1\u00a6",
             "\1\u00a7",
-            "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u00a8",
             "\1\u00a9",
             "\1\u00aa",
-            "\1\u00ab",
             "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00ac",
             "\1\u00ad",
             "\1\u00ae",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "",
+            "\1\u00af",
+            "\1\u00b0",
             "\1\u00b1",
-            "\1\u00b2",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00b4",
-            "\1\u00b5",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00b6",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u00b7",
             "\1\u00b8",
             "\1\u00b9",
-            "\1\u00ba",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00bb",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\5\52\1\u00bc\24\52"+
-            "\105\uffff\100\52",
-            "\1\u00be",
+            "\1\u00bc",
+            "\1\u00bd",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00bf",
-            "\1\u00c1\6\uffff\1\u00c0",
             "",
+            "\1\u00c0",
+            "\1\u00c1",
             "\1\u00c2",
             "\1\u00c3",
-            "\1\u00c4",
-            "\1\u00c5",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\5\53\1\u00c4\24\53"+
+            "\105\uffff\100\53",
             "\1\u00c6",
-            "\1\u00c7",
-            "\1\u00c8",
+            "\1\u00c7\6\uffff\1\u00c8",
             "\1\u00c9",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u00ca",
+            "",
             "\1\u00cb",
-            "",
             "\1\u00cc",
             "\1\u00cd",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "",
+            "\1\u00ce",
             "\1\u00cf",
             "\1\u00d0",
             "\1\u00d1",
-            "\1\u00d2",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "",
             "\1\u00d3",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "",
-            "",
+            "\1\u00d4",
             "\1\u00d5",
             "\1\u00d6",
-            "",
             "\1\u00d7",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u00d8",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
+            "",
             "\1\u00d9",
+            "",
             "\1\u00da",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00db",
             "\1\u00dc",
+            "",
             "\1\u00dd",
+            "\1\u00de",
+            "\1\u00df",
             "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u00df",
-            "\1\u00e0",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00e1",
             "\1\u00e2",
-            "",
             "\1\u00e3",
             "\1\u00e4",
             "\1\u00e5",
-            "\1\u00e6",
+            "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00e7",
             "\1\u00e8",
-            "",
             "\1\u00e9",
             "\1\u00ea",
+            "",
             "\1\u00eb",
-            "",
-            "",
             "\1\u00ec",
             "\1\u00ed",
             "\1\u00ee",
             "\1\u00ef",
+            "\1\u00f0",
             "",
-            "\1\u00f0",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "",
+            "\1\u00f1",
             "\1\u00f2",
             "\1\u00f3",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u00f6",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u00f4",
+            "",
+            "\1\u00f5",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u00f7",
             "\1\u00f8",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u00fa",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
-            "\1\u00f9",
-            "\1\u00fa",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
             "\1\u00fc",
-            "\1\u00fd",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u00fe",
-            "\1\u00ff\21\uffff\1\u0100",
-            "\1\u0101",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u0100",
+            "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u0102",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u0103",
             "\1\u0104",
             "\1\u0105",
             "\1\u0106",
-            "\1\u0107",
-            "\1\u0108",
+            "\1\u0107\21\uffff\1\u0108",
             "\1\u0109",
             "\1\u010a",
             "\1\u010b",
-            "",
             "\1\u010c",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "",
-            "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "",
+            "\1\u010d",
+            "\1\u010e",
             "\1\u010f",
             "\1\u0110",
+            "",
             "\1\u0111",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
+            "\1\u0113",
             "",
-            "\1\u0112",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
-            "\1\u0114",
-            "\1\u0115",
+            "\1\u0116",
             "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
             "\1\u0117",
             "\1\u0118",
             "\1\u0119",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u011c",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
             "",
+            "\1\u011a",
             "",
-            "\1\u011f",
-            "\1\u0120",
+            "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u011c",
+            "\1\u011d",
+            "\1\u011e",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "\1\u0121",
-            "\1\u0122",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
+            "",
             "\1\u0125",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
+            "\1\u0126",
+            "\1\u0127",
+            "\1\u0128",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\1\u012b",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
             "",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
             "",
-            "\1\u0129",
-            "\1\u012a",
-            "\1\u012b",
             "",
             "",
-            "\1\u012c",
+            "\1\u012e",
+            "\1\u012f",
+            "\1\u0130",
             "",
             "",
+            "\1\u0131",
             "",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\1\u012e",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
-            "\12\52\7\uffff\32\52\4\uffff\1\52\1\uffff\32\52\105\uffff\100"+
-            "\52",
             "",
+            "\1\u0132",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
+            "\12\53\7\uffff\32\53\4\uffff\1\53\1\uffff\32\53\105\uffff\100"+
+            "\53",
             "",
             "",
+            "",
             ""
     };
 
@@ -3372,7 +3434,7 @@
             this.transition = DFA18_transition;
         }
         public String getDescription() {
-            return "1:1: Tokens : ( T72 | T73 | T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | GLOBAL | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC );";
+            return "1:1: Tokens : ( T74 | T75 | T76 | T77 | T78 | T79 | T80 | T81 | T82 | T83 | WS | INT | FLOAT | STRING | BOOL | PACKAGE | IMPORT | FUNCTION | EVENT | GLOBAL | RULE | QUERY | TEMPLATE | ATTRIBUTES | DATE_EFFECTIVE | DATE_EXPIRES | ENABLED | SALIENCE | NO_LOOP | AUTO_FOCUS | ACTIVATION_GROUP | AGENDA_GROUP | DIALECT | RULEFLOW_GROUP | DURATION | LOCK_ON_ACTIVE | FROM | ACCUMULATE | INIT | ACTION | REVERSE | RESULT | COLLECT | OR | AND | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | IN | NULL | EXISTS | NOT | EVAL | FORALL | WHEN | THEN | END | ID | LEFT_PAREN | RIGHT_PAREN | LEFT_SQUARE | RIGHT_SQUARE | LEFT_CURLY | RIGHT_CURLY | COMMA | DOT | DOUBLE_AMPER | DOUBLE_PIPE | TILDE | SH_STYLE_SINGLE_LINE_COMMENT | C_STYLE_SINGLE_LINE_COMMENT | MULTI_LINE_COMMENT | MISC );";
         }
     }
  

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DRLParser.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2007-11-12 18:04:44
+// $ANTLR 3.0.1 /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g 2007-12-10 14:18:28
 
 	package org.drools.lang;
 	import java.util.List;
@@ -17,81 +17,83 @@
 import java.util.HashMap;
 public class DRLParser extends Parser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "PACKAGE", "IMPORT", "FUNCTION", "ID", "DOT", "GLOBAL", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "QUERY", "END", "TEMPLATE", "RULE", "WHEN", "ATTRIBUTES", "DATE_EFFECTIVE", "STRING", "DATE_EXPIRES", "ENABLED", "BOOL", "SALIENCE", "INT", "NO_LOOP", "AUTO_FOCUS", "ACTIVATION_GROUP", "RULEFLOW_GROUP", "AGENDA_GROUP", "DURATION", "DIALECT", "LOCK_ON_ACTIVE", "OR", "DOUBLE_PIPE", "AND", "DOUBLE_AMPER", "FROM", "EXISTS", "NOT", "EVAL", "FORALL", "ACCUMULATE", "INIT", "ACTION", "REVERSE", "RESULT", "COLLECT", "CONTAINS", "EXCLUDES", "MATCHES", "SOUNDSLIKE", "MEMBEROF", "IN", "FLOAT", "NULL", "LEFT_CURLY", "RIGHT_CURLY", "LEFT_SQUARE", "RIGHT_SQUARE", "THEN", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT", "MISC", "';'", "'.*'", "':'", "'->'", "'=='", "'>'", "'>='", "'<'", "'<='", "'!='"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "PACKAGE", "IMPORT", "FUNCTION", "EVENT", "ID", "DOT", "GLOBAL", "LEFT_PAREN", "COMMA", "RIGHT_PAREN", "QUERY", "END", "TEMPLATE", "RULE", "WHEN", "ATTRIBUTES", "DATE_EFFECTIVE", "STRING", "DATE_EXPIRES", "ENABLED", "BOOL", "SALIENCE", "INT", "NO_LOOP", "AUTO_FOCUS", "ACTIVATION_GROUP", "RULEFLOW_GROUP", "AGENDA_GROUP", "DURATION", "DIALECT", "LOCK_ON_ACTIVE", "OR", "DOUBLE_PIPE", "AND", "DOUBLE_AMPER", "FROM", "EXISTS", "NOT", "EVAL", "FORALL", "ACCUMULATE", "INIT", "ACTION", "REVERSE", "RESULT", "COLLECT", "CONTAINS", "EXCLUDES", "MATCHES", "SOUNDSLIKE", "MEMBEROF", "TILDE", "IN", "FLOAT", "NULL", "LEFT_CURLY", "RIGHT_CURLY", "LEFT_SQUARE", "RIGHT_SQUARE", "THEN", "EOL", "WS", "EscapeSequence", "HexDigit", "UnicodeEscape", "OctalEscape", "SH_STYLE_SINGLE_LINE_COMMENT", "C_STYLE_SINGLE_LINE_COMMENT", "MULTI_LINE_COMMENT", "MISC", "';'", "'.*'", "':'", "'->'", "'=='", "'>'", "'>='", "'<'", "'<='", "'!='"
     };
-    public static final int COMMA=11;
-    public static final int EXISTS=39;
-    public static final int AUTO_FOCUS=27;
-    public static final int END=14;
-    public static final int HexDigit=65;
-    public static final int FORALL=42;
-    public static final int TEMPLATE=15;
-    public static final int MISC=71;
-    public static final int FLOAT=55;
-    public static final int QUERY=13;
-    public static final int THEN=61;
-    public static final int RULE=16;
-    public static final int INIT=44;
+    public static final int COMMA=12;
+    public static final int EXISTS=40;
+    public static final int AUTO_FOCUS=28;
+    public static final int END=15;
+    public static final int HexDigit=67;
+    public static final int FORALL=43;
+    public static final int TEMPLATE=16;
+    public static final int MISC=73;
+    public static final int FLOAT=57;
+    public static final int QUERY=14;
+    public static final int THEN=63;
+    public static final int RULE=17;
+    public static final int INIT=45;
+    public static final int TILDE=55;
     public static final int IMPORT=5;
-    public static final int DATE_EFFECTIVE=19;
     public static final int PACKAGE=4;
-    public static final int OR=34;
-    public static final int DOT=8;
-    public static final int DOUBLE_PIPE=35;
-    public static final int AND=36;
+    public static final int DATE_EFFECTIVE=20;
+    public static final int OR=35;
+    public static final int DOT=9;
+    public static final int DOUBLE_PIPE=36;
+    public static final int AND=37;
     public static final int FUNCTION=6;
-    public static final int GLOBAL=9;
-    public static final int EscapeSequence=64;
-    public static final int DIALECT=32;
-    public static final int INT=25;
-    public static final int LOCK_ON_ACTIVE=33;
-    public static final int DATE_EXPIRES=21;
-    public static final int LEFT_SQUARE=59;
-    public static final int CONTAINS=49;
-    public static final int SH_STYLE_SINGLE_LINE_COMMENT=68;
-    public static final int ATTRIBUTES=18;
-    public static final int LEFT_CURLY=57;
-    public static final int RESULT=47;
-    public static final int ID=7;
-    public static final int FROM=38;
-    public static final int LEFT_PAREN=10;
-    public static final int ACTIVATION_GROUP=28;
-    public static final int DOUBLE_AMPER=37;
-    public static final int RIGHT_CURLY=58;
-    public static final int SOUNDSLIKE=52;
-    public static final int EXCLUDES=50;
-    public static final int BOOL=23;
-    public static final int MEMBEROF=53;
-    public static final int WHEN=17;
-    public static final int RULEFLOW_GROUP=29;
-    public static final int WS=63;
-    public static final int STRING=20;
-    public static final int ACTION=45;
-    public static final int COLLECT=48;
-    public static final int IN=54;
-    public static final int REVERSE=46;
-    public static final int NO_LOOP=26;
-    public static final int ACCUMULATE=43;
-    public static final int UnicodeEscape=66;
-    public static final int DURATION=31;
-    public static final int EVAL=41;
-    public static final int MATCHES=51;
+    public static final int GLOBAL=10;
+    public static final int EscapeSequence=66;
+    public static final int DIALECT=33;
+    public static final int INT=26;
+    public static final int LOCK_ON_ACTIVE=34;
+    public static final int DATE_EXPIRES=22;
+    public static final int LEFT_SQUARE=61;
+    public static final int CONTAINS=50;
+    public static final int SH_STYLE_SINGLE_LINE_COMMENT=70;
+    public static final int ATTRIBUTES=19;
+    public static final int EVENT=7;
+    public static final int LEFT_CURLY=59;
+    public static final int RESULT=48;
+    public static final int ID=8;
+    public static final int FROM=39;
+    public static final int LEFT_PAREN=11;
+    public static final int ACTIVATION_GROUP=29;
+    public static final int DOUBLE_AMPER=38;
+    public static final int RIGHT_CURLY=60;
+    public static final int SOUNDSLIKE=53;
+    public static final int EXCLUDES=51;
+    public static final int BOOL=24;
+    public static final int MEMBEROF=54;
+    public static final int WHEN=18;
+    public static final int RULEFLOW_GROUP=30;
+    public static final int WS=65;
+    public static final int STRING=21;
+    public static final int ACTION=46;
+    public static final int COLLECT=49;
+    public static final int IN=56;
+    public static final int REVERSE=47;
+    public static final int ACCUMULATE=44;
+    public static final int NO_LOOP=27;
+    public static final int UnicodeEscape=68;
+    public static final int DURATION=32;
+    public static final int EVAL=42;
+    public static final int MATCHES=52;
     public static final int EOF=-1;
-    public static final int EOL=62;
-    public static final int NULL=56;
-    public static final int AGENDA_GROUP=30;
-    public static final int OctalEscape=67;
-    public static final int SALIENCE=24;
-    public static final int MULTI_LINE_COMMENT=70;
-    public static final int RIGHT_PAREN=12;
-    public static final int NOT=40;
-    public static final int ENABLED=22;
-    public static final int RIGHT_SQUARE=60;
-    public static final int C_STYLE_SINGLE_LINE_COMMENT=69;
+    public static final int EOL=64;
+    public static final int NULL=58;
+    public static final int AGENDA_GROUP=31;
+    public static final int OctalEscape=69;
+    public static final int SALIENCE=25;
+    public static final int MULTI_LINE_COMMENT=72;
+    public static final int RIGHT_PAREN=13;
+    public static final int NOT=41;
+    public static final int ENABLED=23;
+    public static final int RIGHT_SQUARE=62;
+    public static final int C_STYLE_SINGLE_LINE_COMMENT=71;
 
         public DRLParser(TokenStream input) {
             super(input);
-            ruleMemo = new HashMap[80+1];
+            ruleMemo = new HashMap[81+1];
          }
         
 
@@ -288,14 +290,14 @@
             int alt1=2;
             int LA1_0 = input.LA(1);
 
-            if ( (LA1_0==72) ) {
+            if ( (LA1_0==74) ) {
                 alt1=1;
             }
             switch (alt1) {
                 case 1 :
                     // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:196:4: ';'
                     {
-                    match(input,72,FOLLOW_72_in_opt_semicolon39); if (failed) return ;
+                    match(input,74,FOLLOW_74_in_opt_semicolon39); if (failed) return ;
 
                     }
                     break;
@@ -435,7 +437,7 @@
 
 
     // $ANTLR start statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:223:1: statement : (a= rule_attribute | function_import_statement | event_import_statement | import_statement | global | function | t= template | r= rule | q= query );
     public final void statement() throws RecognitionException {
         AttributeDescr a = null;
 
@@ -447,8 +449,8 @@
 
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:224:2: (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query )
-            int alt4=8;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:224:2: (a= rule_attribute | function_import_statement | event_import_statement | import_statement | global | function | t= template | r= rule | q= query )
+            int alt4=9;
             switch ( input.LA(1) ) {
             case DATE_EFFECTIVE:
             case DATE_EXPIRES:
@@ -468,52 +470,61 @@
                 break;
             case IMPORT:
                 {
-                int LA4_2 = input.LA(2);
-
-                if ( (LA4_2==FUNCTION) ) {
+                switch ( input.LA(2) ) {
+                case EVENT:
+                    {
+                    alt4=3;
+                    }
+                    break;
+                case FUNCTION:
+                    {
                     alt4=2;
-                }
-                else if ( (LA4_2==ID) ) {
-                    alt4=3;
-                }
-                else {
+                    }
+                    break;
+                case ID:
+                    {
+                    alt4=4;
+                    }
+                    break;
+                default:
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query );", 4, 2, input);
+                        new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | event_import_statement | import_statement | global | function | t= template | r= rule | q= query );", 4, 2, input);
 
                     throw nvae;
                 }
+
                 }
                 break;
             case GLOBAL:
                 {
-                alt4=4;
+                alt4=5;
                 }
                 break;
             case FUNCTION:
                 {
-                alt4=5;
+                alt4=6;
                 }
                 break;
             case TEMPLATE:
                 {
-                alt4=6;
+                alt4=7;
                 }
                 break;
             case RULE:
                 {
-                alt4=7;
+                alt4=8;
                 }
                 break;
             case QUERY:
                 {
-                alt4=8;
+                alt4=9;
                 }
                 break;
             default:
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | import_statement | global | function | t= template | r= rule | q= query );", 4, 0, input);
+                    new NoViableAltException("223:1: statement : (a= rule_attribute | function_import_statement | event_import_statement | import_statement | global | function | t= template | r= rule | q= query );", 4, 0, input);
 
                 throw nvae;
             }
@@ -543,39 +554,49 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:226:4: import_statement
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:226:4: event_import_statement
                     {
-                    pushFollow(FOLLOW_import_statement_in_statement134);
-                    import_statement();
+                    pushFollow(FOLLOW_event_import_statement_in_statement134);
+                    event_import_statement();
                     _fsp--;
                     if (failed) return ;
 
                     }
                     break;
                 case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:227:4: global
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:227:4: import_statement
                     {
-                    pushFollow(FOLLOW_global_in_statement140);
-                    global();
+                    pushFollow(FOLLOW_import_statement_in_statement139);
+                    import_statement();
                     _fsp--;
                     if (failed) return ;
 
                     }
                     break;
                 case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:228:4: function
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:228:4: global
                     {
-                    pushFollow(FOLLOW_function_in_statement146);
-                    function();
+                    pushFollow(FOLLOW_global_in_statement145);
+                    global();
                     _fsp--;
                     if (failed) return ;
 
                     }
                     break;
                 case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:229:10: t= template
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:229:4: function
                     {
-                    pushFollow(FOLLOW_template_in_statement160);
+                    pushFollow(FOLLOW_function_in_statement151);
+                    function();
+                    _fsp--;
+                    if (failed) return ;
+
+                    }
+                    break;
+                case 7 :
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:230:10: t= template
+                    {
+                    pushFollow(FOLLOW_template_in_statement165);
                     t=template();
                     _fsp--;
                     if (failed) return ;
@@ -585,10 +606,10 @@
 
                     }
                     break;
-                case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:230:4: r= rule
+                case 8 :
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:231:4: r= rule
                     {
-                    pushFollow(FOLLOW_rule_in_statement169);
+                    pushFollow(FOLLOW_rule_in_statement174);
                     r=rule();
                     _fsp--;
                     if (failed) return ;
@@ -598,10 +619,10 @@
 
                     }
                     break;
-                case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:231:4: q= query
+                case 9 :
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:232:4: q= query
                     {
-                    pushFollow(FOLLOW_query_in_statement181);
+                    pushFollow(FOLLOW_query_in_statement186);
                     q=query();
                     _fsp--;
                     if (failed) return ;
@@ -626,7 +647,7 @@
 
 
     // $ANTLR start package_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:233:1: package_statement returns [String packageName] : PACKAGE n= dotted_name opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:235:1: package_statement returns [String packageName] : PACKAGE n= dotted_name opt_semicolon ;
     public final String package_statement() throws RecognitionException {
         String packageName = null;
 
@@ -637,15 +658,15 @@
         		packageName = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:237:2: ( PACKAGE n= dotted_name opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:238:3: PACKAGE n= dotted_name opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:239:2: ( PACKAGE n= dotted_name opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:240:3: PACKAGE n= dotted_name opt_semicolon
             {
-            match(input,PACKAGE,FOLLOW_PACKAGE_in_package_statement205); if (failed) return packageName;
-            pushFollow(FOLLOW_dotted_name_in_package_statement209);
+            match(input,PACKAGE,FOLLOW_PACKAGE_in_package_statement212); if (failed) return packageName;
+            pushFollow(FOLLOW_dotted_name_in_package_statement216);
             n=dotted_name();
             _fsp--;
             if (failed) return packageName;
-            pushFollow(FOLLOW_opt_semicolon_in_package_statement211);
+            pushFollow(FOLLOW_opt_semicolon_in_package_statement218);
             opt_semicolon();
             _fsp--;
             if (failed) return packageName;
@@ -670,7 +691,7 @@
 
 
     // $ANTLR start import_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:246:1: import_statement : IMPORT import_name[importDecl] opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:248:1: import_statement : IMPORT import_name[importDecl] opt_semicolon ;
     public final void import_statement() throws RecognitionException {
         Token IMPORT1=null;
 
@@ -678,11 +699,11 @@
                 	ImportDescr importDecl = null;
                 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:250:2: ( IMPORT import_name[importDecl] opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:250:4: IMPORT import_name[importDecl] opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:252:2: ( IMPORT import_name[importDecl] opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:252:4: IMPORT import_name[importDecl] opt_semicolon
             {
             IMPORT1=(Token)input.LT(1);
-            match(input,IMPORT,FOLLOW_IMPORT_in_import_statement242); if (failed) return ;
+            match(input,IMPORT,FOLLOW_IMPORT_in_import_statement249); if (failed) return ;
             if ( backtracking==0 ) {
 
               	            importDecl = factory.createImport( );
@@ -692,11 +713,11 @@
               		    }
               	        
             }
-            pushFollow(FOLLOW_import_name_in_import_statement265);
+            pushFollow(FOLLOW_import_name_in_import_statement272);
             import_name(importDecl);
             _fsp--;
             if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_import_statement268);
+            pushFollow(FOLLOW_opt_semicolon_in_import_statement275);
             opt_semicolon();
             _fsp--;
             if (failed) return ;
@@ -716,7 +737,7 @@
 
 
     // $ANTLR start function_import_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:261:1: function_import_statement : IMPORT FUNCTION import_name[importDecl] opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:263:1: function_import_statement : IMPORT FUNCTION import_name[importDecl] opt_semicolon ;
     public final void function_import_statement() throws RecognitionException {
         Token IMPORT2=null;
 
@@ -724,12 +745,12 @@
                 	FunctionImportDescr importDecl = null;
                 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:265:2: ( IMPORT FUNCTION import_name[importDecl] opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:265:4: IMPORT FUNCTION import_name[importDecl] opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:267:2: ( IMPORT FUNCTION import_name[importDecl] opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:267:4: IMPORT FUNCTION import_name[importDecl] opt_semicolon
             {
             IMPORT2=(Token)input.LT(1);
-            match(input,IMPORT,FOLLOW_IMPORT_in_function_import_statement292); if (failed) return ;
-            match(input,FUNCTION,FOLLOW_FUNCTION_in_function_import_statement294); if (failed) return ;
+            match(input,IMPORT,FOLLOW_IMPORT_in_function_import_statement299); if (failed) return ;
+            match(input,FUNCTION,FOLLOW_FUNCTION_in_function_import_statement301); if (failed) return ;
             if ( backtracking==0 ) {
 
               	            importDecl = factory.createFunctionImport();
@@ -739,11 +760,11 @@
               		    }
               	        
             }
-            pushFollow(FOLLOW_import_name_in_function_import_statement317);
+            pushFollow(FOLLOW_import_name_in_function_import_statement324);
             import_name(importDecl);
             _fsp--;
             if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_function_import_statement320);
+            pushFollow(FOLLOW_opt_semicolon_in_function_import_statement327);
             opt_semicolon();
             _fsp--;
             if (failed) return ;
@@ -762,14 +783,61 @@
     // $ANTLR end function_import_statement
 
 
+    // $ANTLR start event_import_statement
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:278:1: event_import_statement : IMPORT EVENT import_name[importDecl] opt_semicolon ;
+    public final void event_import_statement() throws RecognitionException {
+        Token IMPORT3=null;
+
+
+                	ImportDescr importDecl = null;
+                
+        try {
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:282:2: ( IMPORT EVENT import_name[importDecl] opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:282:4: IMPORT EVENT import_name[importDecl] opt_semicolon
+            {
+            IMPORT3=(Token)input.LT(1);
+            match(input,IMPORT,FOLLOW_IMPORT_in_event_import_statement351); if (failed) return ;
+            match(input,EVENT,FOLLOW_EVENT_in_event_import_statement353); if (failed) return ;
+            if ( backtracking==0 ) {
+
+              	            importDecl = factory.createEventImport( );
+              	            importDecl.setStartCharacter( ((CommonToken)IMPORT3).getStartIndex() );
+              		    if (packageDescr != null) {
+              			packageDescr.addImport( importDecl );
+              		    }
+              	        
+            }
+            pushFollow(FOLLOW_import_name_in_event_import_statement376);
+            import_name(importDecl);
+            _fsp--;
+            if (failed) return ;
+            pushFollow(FOLLOW_opt_semicolon_in_event_import_statement379);
+            opt_semicolon();
+            _fsp--;
+            if (failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end event_import_statement
+
+
     // $ANTLR start import_name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:277:1: import_name[ImportDescr importDecl] returns [String name] : ID ( DOT id= identifier )* (star= '.*' )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:294:1: import_name[ImportDescr importDecl] returns [String name] : ID ( DOT id= identifier )* (star= '.*' )? ;
     public final String import_name(ImportDescr importDecl) throws RecognitionException {
         String name = null;
 
         Token star=null;
-        Token ID3=null;
-        Token DOT4=null;
+        Token ID4=null;
+        Token DOT5=null;
         identifier_return id = null;
 
 
@@ -777,19 +845,19 @@
         		name = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:281:2: ( ID ( DOT id= identifier )* (star= '.*' )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:282:3: ID ( DOT id= identifier )* (star= '.*' )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:298:2: ( ID ( DOT id= identifier )* (star= '.*' )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:299:3: ID ( DOT id= identifier )* (star= '.*' )?
             {
-            ID3=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_import_name346); if (failed) return name;
+            ID4=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_import_name405); if (failed) return name;
             if ( backtracking==0 ) {
                
-              		    name =ID3.getText(); 
+              		    name =ID4.getText(); 
               		    importDecl.setTarget( name );
-              		    importDecl.setEndCharacter( ((CommonToken)ID3).getStopIndex() );
+              		    importDecl.setEndCharacter( ((CommonToken)ID4).getStopIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:3: ( DOT id= identifier )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:305:3: ( DOT id= identifier )*
             loop5:
             do {
                 int alt5=2;
@@ -802,17 +870,17 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:288:5: DOT id= identifier
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:305:5: DOT id= identifier
             	    {
-            	    DOT4=(Token)input.LT(1);
-            	    match(input,DOT,FOLLOW_DOT_in_import_name358); if (failed) return name;
-            	    pushFollow(FOLLOW_identifier_in_import_name362);
+            	    DOT5=(Token)input.LT(1);
+            	    match(input,DOT,FOLLOW_DOT_in_import_name417); if (failed) return name;
+            	    pushFollow(FOLLOW_identifier_in_import_name421);
             	    id=identifier();
             	    _fsp--;
             	    if (failed) return name;
             	    if ( backtracking==0 ) {
             	       
-            	      		        name = name + DOT4.getText() + input.toString(id.start,id.stop); 
+            	      		        name = name + DOT5.getText() + input.toString(id.start,id.stop); 
             	      			importDecl.setTarget( name );
             	      		        importDecl.setEndCharacter( ((CommonToken)((Token)id.start)).getStopIndex() );
             	      		    
@@ -826,19 +894,19 @@
                 }
             } while (true);
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:295:3: (star= '.*' )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:312:3: (star= '.*' )?
             int alt6=2;
             int LA6_0 = input.LA(1);
 
-            if ( (LA6_0==73) ) {
+            if ( (LA6_0==75) ) {
                 alt6=1;
             }
             switch (alt6) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:295:5: star= '.*'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:312:5: star= '.*'
                     {
                     star=(Token)input.LT(1);
-                    match(input,73,FOLLOW_73_in_import_name386); if (failed) return name;
+                    match(input,75,FOLLOW_75_in_import_name445); if (failed) return name;
                     if ( backtracking==0 ) {
                        
                       		        name = name + star.getText(); 
@@ -868,9 +936,9 @@
 
 
     // $ANTLR start global
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:305:1: global : GLOBAL type= dotted_name id= identifier opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:322:1: global : GLOBAL type= dotted_name id= identifier opt_semicolon ;
     public final void global() throws RecognitionException {
-        Token GLOBAL5=null;
+        Token GLOBAL6=null;
         String type = null;
 
         identifier_return id = null;
@@ -880,19 +948,19 @@
         	    GlobalDescr global = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:309:2: ( GLOBAL type= dotted_name id= identifier opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:310:3: GLOBAL type= dotted_name id= identifier opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:326:2: ( GLOBAL type= dotted_name id= identifier opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:327:3: GLOBAL type= dotted_name id= identifier opt_semicolon
             {
-            GLOBAL5=(Token)input.LT(1);
-            match(input,GLOBAL,FOLLOW_GLOBAL_in_global420); if (failed) return ;
+            GLOBAL6=(Token)input.LT(1);
+            match(input,GLOBAL,FOLLOW_GLOBAL_in_global479); if (failed) return ;
             if ( backtracking==0 ) {
 
               		    global = factory.createGlobal();
-              	            global.setStartCharacter( ((CommonToken)GLOBAL5).getStartIndex() );
+              	            global.setStartCharacter( ((CommonToken)GLOBAL6).getStartIndex() );
               		    packageDescr.addGlobal( global );
               		
             }
-            pushFollow(FOLLOW_dotted_name_in_global431);
+            pushFollow(FOLLOW_dotted_name_in_global490);
             type=dotted_name();
             _fsp--;
             if (failed) return ;
@@ -901,11 +969,11 @@
               		    global.setType( type );
               		
             }
-            pushFollow(FOLLOW_identifier_in_global442);
+            pushFollow(FOLLOW_identifier_in_global501);
             id=identifier();
             _fsp--;
             if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_global444);
+            pushFollow(FOLLOW_opt_semicolon_in_global503);
             opt_semicolon();
             _fsp--;
             if (failed) return ;
@@ -931,9 +999,9 @@
 
 
     // $ANTLR start function
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:328:1: function : FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:345:1: function : FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk ;
     public final void function() throws RecognitionException {
-        Token FUNCTION6=null;
+        Token FUNCTION7=null;
         String retType = null;
 
         identifier_return id = null;
@@ -950,27 +1018,27 @@
         		String type = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:333:2: ( FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:334:3: FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:350:2: ( FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:351:3: FUNCTION (retType= dotted_name )? id= identifier LEFT_PAREN ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )? RIGHT_PAREN body= curly_chunk
             {
-            FUNCTION6=(Token)input.LT(1);
-            match(input,FUNCTION,FOLLOW_FUNCTION_in_function469); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:334:19: (retType= dotted_name )?
+            FUNCTION7=(Token)input.LT(1);
+            match(input,FUNCTION,FOLLOW_FUNCTION_in_function528); if (failed) return ;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:351:19: (retType= dotted_name )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
-            if ( ((LA7_0>=PACKAGE && LA7_0<=ID)||LA7_0==GLOBAL||(LA7_0>=QUERY && LA7_0<=ATTRIBUTES)||LA7_0==ENABLED||LA7_0==SALIENCE||(LA7_0>=DURATION && LA7_0<=DIALECT)||LA7_0==FROM||(LA7_0>=INIT && LA7_0<=RESULT)||(LA7_0>=CONTAINS && LA7_0<=IN)||LA7_0==THEN) ) {
+            if ( ((LA7_0>=PACKAGE && LA7_0<=ID)||LA7_0==GLOBAL||(LA7_0>=QUERY && LA7_0<=ATTRIBUTES)||LA7_0==ENABLED||LA7_0==SALIENCE||(LA7_0>=DURATION && LA7_0<=DIALECT)||LA7_0==FROM||(LA7_0>=INIT && LA7_0<=RESULT)||(LA7_0>=CONTAINS && LA7_0<=MEMBEROF)||LA7_0==IN||LA7_0==THEN) ) {
                 int LA7_1 = input.LA(2);
 
-                if ( ((LA7_1>=PACKAGE && LA7_1<=GLOBAL)||(LA7_1>=QUERY && LA7_1<=ATTRIBUTES)||LA7_1==ENABLED||LA7_1==SALIENCE||(LA7_1>=DURATION && LA7_1<=DIALECT)||LA7_1==FROM||(LA7_1>=INIT && LA7_1<=RESULT)||(LA7_1>=CONTAINS && LA7_1<=IN)||LA7_1==LEFT_SQUARE||LA7_1==THEN) ) {
+                if ( ((LA7_1>=PACKAGE && LA7_1<=GLOBAL)||(LA7_1>=QUERY && LA7_1<=ATTRIBUTES)||LA7_1==ENABLED||LA7_1==SALIENCE||(LA7_1>=DURATION && LA7_1<=DIALECT)||LA7_1==FROM||(LA7_1>=INIT && LA7_1<=RESULT)||(LA7_1>=CONTAINS && LA7_1<=MEMBEROF)||LA7_1==IN||LA7_1==LEFT_SQUARE||LA7_1==THEN) ) {
                     alt7=1;
                 }
             }
             switch (alt7) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:334:19: retType= dotted_name
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:351:19: retType= dotted_name
                     {
-                    pushFollow(FOLLOW_dotted_name_in_function473);
+                    pushFollow(FOLLOW_dotted_name_in_function532);
                     retType=dotted_name();
                     _fsp--;
                     if (failed) return ;
@@ -980,7 +1048,7 @@
 
             }
 
-            pushFollow(FOLLOW_identifier_in_function478);
+            pushFollow(FOLLOW_identifier_in_function537);
             id=identifier();
             _fsp--;
             if (failed) return ;
@@ -989,31 +1057,31 @@
               			//System.err.println( "function :: " + n.getText() );
               			type = retType != null ? retType : null;
               			f = factory.createFunction( input.toString(id.start,id.stop), type );
-              			f.setLocation(offset(FUNCTION6.getLine()), FUNCTION6.getCharPositionInLine());
-              	        	f.setStartCharacter( ((CommonToken)FUNCTION6).getStartIndex() );
+              			f.setLocation(offset(FUNCTION7.getLine()), FUNCTION7.getCharPositionInLine());
+              	        	f.setStartCharacter( ((CommonToken)FUNCTION7).getStartIndex() );
               			packageDescr.addFunction( f );
               		
             }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_function487); if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:344:4: ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )?
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_function546); if (failed) return ;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:361:4: ( (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )* )?
             int alt11=2;
             int LA11_0 = input.LA(1);
 
-            if ( ((LA11_0>=PACKAGE && LA11_0<=ID)||LA11_0==GLOBAL||(LA11_0>=QUERY && LA11_0<=ATTRIBUTES)||LA11_0==ENABLED||LA11_0==SALIENCE||(LA11_0>=DURATION && LA11_0<=DIALECT)||LA11_0==FROM||(LA11_0>=INIT && LA11_0<=RESULT)||(LA11_0>=CONTAINS && LA11_0<=IN)||LA11_0==THEN) ) {
+            if ( ((LA11_0>=PACKAGE && LA11_0<=ID)||LA11_0==GLOBAL||(LA11_0>=QUERY && LA11_0<=ATTRIBUTES)||LA11_0==ENABLED||LA11_0==SALIENCE||(LA11_0>=DURATION && LA11_0<=DIALECT)||LA11_0==FROM||(LA11_0>=INIT && LA11_0<=RESULT)||(LA11_0>=CONTAINS && LA11_0<=MEMBEROF)||LA11_0==IN||LA11_0==THEN) ) {
                 alt11=1;
             }
             switch (alt11) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:344:6: (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:361:6: (paramType= dotted_name )? paramName= argument ( COMMA (paramType= dotted_name )? paramName= argument )*
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:344:15: (paramType= dotted_name )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:361:15: (paramType= dotted_name )?
                     int alt8=2;
                     alt8 = dfa8.predict(input);
                     switch (alt8) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:344:15: paramType= dotted_name
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:361:15: paramType= dotted_name
                             {
-                            pushFollow(FOLLOW_dotted_name_in_function496);
+                            pushFollow(FOLLOW_dotted_name_in_function555);
                             paramType=dotted_name();
                             _fsp--;
                             if (failed) return ;
@@ -1023,7 +1091,7 @@
 
                     }
 
-                    pushFollow(FOLLOW_argument_in_function501);
+                    pushFollow(FOLLOW_argument_in_function560);
                     paramName=argument();
                     _fsp--;
                     if (failed) return ;
@@ -1033,7 +1101,7 @@
                       					f.addParameter( type, paramName );
                       				
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:349:5: ( COMMA (paramType= dotted_name )? paramName= argument )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:5: ( COMMA (paramType= dotted_name )? paramName= argument )*
                     loop10:
                     do {
                         int alt10=2;
@@ -1046,17 +1114,17 @@
 
                         switch (alt10) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:349:7: COMMA (paramType= dotted_name )? paramName= argument
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:7: COMMA (paramType= dotted_name )? paramName= argument
                     	    {
-                    	    match(input,COMMA,FOLLOW_COMMA_in_function515); if (failed) return ;
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:349:22: (paramType= dotted_name )?
+                    	    match(input,COMMA,FOLLOW_COMMA_in_function574); if (failed) return ;
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:22: (paramType= dotted_name )?
                     	    int alt9=2;
                     	    alt9 = dfa9.predict(input);
                     	    switch (alt9) {
                     	        case 1 :
-                    	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:349:22: paramType= dotted_name
+                    	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:22: paramType= dotted_name
                     	            {
-                    	            pushFollow(FOLLOW_dotted_name_in_function519);
+                    	            pushFollow(FOLLOW_dotted_name_in_function578);
                     	            paramType=dotted_name();
                     	            _fsp--;
                     	            if (failed) return ;
@@ -1066,7 +1134,7 @@
 
                     	    }
 
-                    	    pushFollow(FOLLOW_argument_in_function524);
+                    	    pushFollow(FOLLOW_argument_in_function583);
                     	    paramName=argument();
                     	    _fsp--;
                     	    if (failed) return ;
@@ -1091,8 +1159,8 @@
 
             }
 
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_function548); if (failed) return ;
-            pushFollow(FOLLOW_curly_chunk_in_function554);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_function607); if (failed) return ;
+            pushFollow(FOLLOW_curly_chunk_in_function613);
             body=curly_chunk();
             _fsp--;
             if (failed) return ;
@@ -1120,7 +1188,7 @@
 
 
     // $ANTLR start argument
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:366:1: argument returns [String name] : id= identifier ( '[' ']' )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:1: argument returns [String name] : id= identifier ( '[' ']' )* ;
     public final String argument() throws RecognitionException {
         String name = null;
 
@@ -1131,17 +1199,17 @@
         		name = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:370:2: (id= identifier ( '[' ']' )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:370:4: id= identifier ( '[' ']' )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:2: (id= identifier ( '[' ']' )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:4: id= identifier ( '[' ']' )*
             {
-            pushFollow(FOLLOW_identifier_in_argument581);
+            pushFollow(FOLLOW_identifier_in_argument640);
             id=identifier();
             _fsp--;
             if (failed) return name;
             if ( backtracking==0 ) {
                name =input.toString(id.start,id.stop); 
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:370:38: ( '[' ']' )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:38: ( '[' ']' )*
             loop12:
             do {
                 int alt12=2;
@@ -1154,10 +1222,10 @@
 
                 switch (alt12) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:370:40: '[' ']'
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:387:40: '[' ']'
             	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_argument587); if (failed) return name;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_argument589); if (failed) return name;
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_argument646); if (failed) return name;
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_argument648); if (failed) return name;
             	    if ( backtracking==0 ) {
             	       name += "[]";
             	    }
@@ -1186,13 +1254,13 @@
 
 
     // $ANTLR start query
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:375:1: query returns [QueryDescr query] : QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:392:1: query returns [QueryDescr query] : QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon ;
     public final QueryDescr query() throws RecognitionException {
         QueryDescr query = null;
 
         Token paramName=null;
-        Token QUERY7=null;
-        Token END8=null;
+        Token QUERY8=null;
+        Token END9=null;
         String queryName = null;
 
         qualified_id_return paramType = null;
@@ -1206,34 +1274,34 @@
          
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:383:2: ( QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:384:3: QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:400:2: ( QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:401:3: QUERY queryName= name ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )? normal_lhs_block[lhs] END opt_semicolon
             {
-            QUERY7=(Token)input.LT(1);
-            match(input,QUERY,FOLLOW_QUERY_in_query619); if (failed) return query;
-            pushFollow(FOLLOW_name_in_query623);
+            QUERY8=(Token)input.LT(1);
+            match(input,QUERY,FOLLOW_QUERY_in_query678); if (failed) return query;
+            pushFollow(FOLLOW_name_in_query682);
             queryName=name();
             _fsp--;
             if (failed) return query;
             if ( backtracking==0 ) {
                
               			query = factory.createQuery( queryName ); 
-              			query.setLocation( offset(QUERY7.getLine()), QUERY7.getCharPositionInLine() );
-              			query.setStartCharacter( ((CommonToken)QUERY7).getStartIndex() );
+              			query.setLocation( offset(QUERY8.getLine()), QUERY8.getCharPositionInLine() );
+              			query.setStartCharacter( ((CommonToken)QUERY8).getStartIndex() );
               			lhs = new AndDescr(); query.setLhs( lhs ); 
-              			lhs.setLocation( offset(QUERY7.getLine()), QUERY7.getCharPositionInLine() );
+              			lhs.setLocation( offset(QUERY8.getLine()), QUERY8.getCharPositionInLine() );
                                       location.setType( Location.LOCATION_RULE_HEADER );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:393:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:410:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?
             int alt17=2;
             alt17 = dfa17.predict(input);
             switch (alt17) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:393:5: LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:410:5: LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_query633); if (failed) return query;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:394:11: ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )?
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_query692); if (failed) return query;
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:411:11: ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )?
                     int alt16=2;
                     int LA16_0 = input.LA(1);
 
@@ -1242,15 +1310,15 @@
                     }
                     switch (alt16) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:394:13: ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )*
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:411:13: ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )*
                             {
                             if ( backtracking==0 ) {
                                params = new ArrayList(); types = new ArrayList();
                             }
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:396:15: ( (paramType= qualified_id )? paramName= ID )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:396:16: (paramType= qualified_id )? paramName= ID
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:15: ( (paramType= qualified_id )? paramName= ID )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:16: (paramType= qualified_id )? paramName= ID
                             {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:396:25: (paramType= qualified_id )?
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:25: (paramType= qualified_id )?
                             int alt13=2;
                             int LA13_0 = input.LA(1);
 
@@ -1263,9 +1331,9 @@
                             }
                             switch (alt13) {
                                 case 1 :
-                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:396:25: paramType= qualified_id
+                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:413:25: paramType= qualified_id
                                     {
-                                    pushFollow(FOLLOW_qualified_id_in_query668);
+                                    pushFollow(FOLLOW_qualified_id_in_query727);
                                     paramType=qualified_id();
                                     _fsp--;
                                     if (failed) return query;
@@ -1276,14 +1344,14 @@
                             }
 
                             paramName=(Token)input.LT(1);
-                            match(input,ID,FOLLOW_ID_in_query673); if (failed) return query;
+                            match(input,ID,FOLLOW_ID_in_query732); if (failed) return query;
                             if ( backtracking==0 ) {
                                params.add( paramName.getText() ); String type = (paramType != null) ? paramType.text : "Object"; types.add( type ); 
                             }
 
                             }
 
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:397:15: ( COMMA (paramType= qualified_id )? paramName= ID )*
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:414:15: ( COMMA (paramType= qualified_id )? paramName= ID )*
                             loop15:
                             do {
                                 int alt15=2;
@@ -1296,10 +1364,10 @@
 
                                 switch (alt15) {
                             	case 1 :
-                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:397:16: COMMA (paramType= qualified_id )? paramName= ID
+                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:414:16: COMMA (paramType= qualified_id )? paramName= ID
                             	    {
-                            	    match(input,COMMA,FOLLOW_COMMA_in_query694); if (failed) return query;
-                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:397:31: (paramType= qualified_id )?
+                            	    match(input,COMMA,FOLLOW_COMMA_in_query753); if (failed) return query;
+                            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:414:31: (paramType= qualified_id )?
                             	    int alt14=2;
                             	    int LA14_0 = input.LA(1);
 
@@ -1312,9 +1380,9 @@
                             	    }
                             	    switch (alt14) {
                             	        case 1 :
-                            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:397:31: paramType= qualified_id
+                            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:414:31: paramType= qualified_id
                             	            {
-                            	            pushFollow(FOLLOW_qualified_id_in_query698);
+                            	            pushFollow(FOLLOW_qualified_id_in_query757);
                             	            paramType=qualified_id();
                             	            _fsp--;
                             	            if (failed) return query;
@@ -1325,7 +1393,7 @@
                             	    }
 
                             	    paramName=(Token)input.LT(1);
-                            	    match(input,ID,FOLLOW_ID_in_query703); if (failed) return query;
+                            	    match(input,ID,FOLLOW_ID_in_query762); if (failed) return query;
                             	    if ( backtracking==0 ) {
                             	       params.add( paramName.getText() );  String type = (paramType != null) ? paramType.text : "Object"; types.add( type );  
                             	    }
@@ -1349,7 +1417,7 @@
 
                     }
 
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_query753); if (failed) return query;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_query812); if (failed) return query;
 
                     }
                     break;
@@ -1361,19 +1429,19 @@
                                       location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
               	        
             }
-            pushFollow(FOLLOW_normal_lhs_block_in_query782);
+            pushFollow(FOLLOW_normal_lhs_block_in_query841);
             normal_lhs_block(lhs);
             _fsp--;
             if (failed) return query;
-            END8=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_query787); if (failed) return query;
-            pushFollow(FOLLOW_opt_semicolon_in_query789);
+            END9=(Token)input.LT(1);
+            match(input,END,FOLLOW_END_in_query846); if (failed) return query;
+            pushFollow(FOLLOW_opt_semicolon_in_query848);
             opt_semicolon();
             _fsp--;
             if (failed) return query;
             if ( backtracking==0 ) {
 
-              			query.setEndCharacter( ((CommonToken)END8).getStopIndex() );
+              			query.setEndCharacter( ((CommonToken)END9).getStopIndex() );
               		
             }
 
@@ -1392,12 +1460,12 @@
 
 
     // $ANTLR start template
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:415:1: template returns [FactTemplateDescr template] : TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:432:1: template returns [FactTemplateDescr template] : TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon ;
     public final FactTemplateDescr template() throws RecognitionException {
         FactTemplateDescr template = null;
 
-        Token TEMPLATE9=null;
-        Token END10=null;
+        Token TEMPLATE10=null;
+        Token END11=null;
         String templateName = null;
 
         FieldTemplateDescr slot = null;
@@ -1407,27 +1475,27 @@
         		template = null;		
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:419:2: ( TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:420:3: TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:436:2: ( TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:437:3: TEMPLATE templateName= name opt_semicolon (slot= template_slot )+ END opt_semicolon
             {
-            TEMPLATE9=(Token)input.LT(1);
-            match(input,TEMPLATE,FOLLOW_TEMPLATE_in_template817); if (failed) return template;
-            pushFollow(FOLLOW_name_in_template821);
+            TEMPLATE10=(Token)input.LT(1);
+            match(input,TEMPLATE,FOLLOW_TEMPLATE_in_template876); if (failed) return template;
+            pushFollow(FOLLOW_name_in_template880);
             templateName=name();
             _fsp--;
             if (failed) return template;
-            pushFollow(FOLLOW_opt_semicolon_in_template823);
+            pushFollow(FOLLOW_opt_semicolon_in_template882);
             opt_semicolon();
             _fsp--;
             if (failed) return template;
             if ( backtracking==0 ) {
 
               			template = new FactTemplateDescr(templateName);
-              			template.setLocation( offset(TEMPLATE9.getLine()), TEMPLATE9.getCharPositionInLine() );			
-              			template.setStartCharacter( ((CommonToken)TEMPLATE9).getStartIndex() );
+              			template.setLocation( offset(TEMPLATE10.getLine()), TEMPLATE10.getCharPositionInLine() );			
+              			template.setStartCharacter( ((CommonToken)TEMPLATE10).getStartIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:426:3: (slot= template_slot )+
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:443:3: (slot= template_slot )+
             int cnt18=0;
             loop18:
             do {
@@ -1441,9 +1509,9 @@
 
                 switch (alt18) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:427:4: slot= template_slot
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:444:4: slot= template_slot
             	    {
-            	    pushFollow(FOLLOW_template_slot_in_template838);
+            	    pushFollow(FOLLOW_template_slot_in_template897);
             	    slot=template_slot();
             	    _fsp--;
             	    if (failed) return template;
@@ -1466,15 +1534,15 @@
                 cnt18++;
             } while (true);
 
-            END10=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_template853); if (failed) return template;
-            pushFollow(FOLLOW_opt_semicolon_in_template855);
+            END11=(Token)input.LT(1);
+            match(input,END,FOLLOW_END_in_template912); if (failed) return template;
+            pushFollow(FOLLOW_opt_semicolon_in_template914);
             opt_semicolon();
             _fsp--;
             if (failed) return template;
             if ( backtracking==0 ) {
 
-              			template.setEndCharacter( ((CommonToken)END10).getStopIndex() );
+              			template.setEndCharacter( ((CommonToken)END11).getStopIndex() );
               		
             }
 
@@ -1493,7 +1561,7 @@
 
 
     // $ANTLR start template_slot
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:438:1: template_slot returns [FieldTemplateDescr field] : fieldType= qualified_id id= identifier opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:455:1: template_slot returns [FieldTemplateDescr field] : fieldType= qualified_id id= identifier opt_semicolon ;
     public final FieldTemplateDescr template_slot() throws RecognitionException {
         FieldTemplateDescr field = null;
 
@@ -1506,15 +1574,15 @@
         		field = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:442:2: (fieldType= qualified_id id= identifier opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:443:11: fieldType= qualified_id id= identifier opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:459:2: (fieldType= qualified_id id= identifier opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:460:11: fieldType= qualified_id id= identifier opt_semicolon
             {
             if ( backtracking==0 ) {
 
               			field = factory.createFieldTemplate();
               	         
             }
-            pushFollow(FOLLOW_qualified_id_in_template_slot901);
+            pushFollow(FOLLOW_qualified_id_in_template_slot960);
             fieldType=qualified_id();
             _fsp--;
             if (failed) return field;
@@ -1525,11 +1593,11 @@
               			field.setEndCharacter( ((CommonToken)((Token)fieldType.stop)).getStopIndex() );
               		 
             }
-            pushFollow(FOLLOW_identifier_in_template_slot917);
+            pushFollow(FOLLOW_identifier_in_template_slot976);
             id=identifier();
             _fsp--;
             if (failed) return field;
-            pushFollow(FOLLOW_opt_semicolon_in_template_slot919);
+            pushFollow(FOLLOW_opt_semicolon_in_template_slot978);
             opt_semicolon();
             _fsp--;
             if (failed) return field;
@@ -1556,12 +1624,12 @@
 
 
     // $ANTLR start rule
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:461:1: rule returns [RuleDescr rule] : RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule] ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:478:1: rule returns [RuleDescr rule] : RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule] ;
     public final RuleDescr rule() throws RecognitionException {
         RuleDescr rule = null;
 
-        Token RULE11=null;
-        Token WHEN12=null;
+        Token RULE12=null;
+        Token WHEN13=null;
         String ruleName = null;
 
 
@@ -1570,12 +1638,12 @@
         		AndDescr lhs = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:466:2: ( RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:467:3: RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule]
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:483:2: ( RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:484:3: RULE ruleName= name ( rule_attributes[$rule] )? ( WHEN ( ':' )? normal_lhs_block[lhs] )? rhs_chunk[$rule]
             {
-            RULE11=(Token)input.LT(1);
-            match(input,RULE,FOLLOW_RULE_in_rule950); if (failed) return rule;
-            pushFollow(FOLLOW_name_in_rule954);
+            RULE12=(Token)input.LT(1);
+            match(input,RULE,FOLLOW_RULE_in_rule1009); if (failed) return rule;
+            pushFollow(FOLLOW_name_in_rule1013);
             ruleName=name();
             _fsp--;
             if (failed) return rule;
@@ -1584,13 +1652,13 @@
               			location.setType( Location.LOCATION_RULE_HEADER );
               			debug( "start rule: " + ruleName );
               			rule = new RuleDescr( ruleName, null ); 
-              			rule.setLocation( offset(RULE11.getLine()), RULE11.getCharPositionInLine() );
-              			rule.setStartCharacter( ((CommonToken)RULE11).getStartIndex() );
+              			rule.setLocation( offset(RULE12.getLine()), RULE12.getCharPositionInLine() );
+              			rule.setStartCharacter( ((CommonToken)RULE12).getStartIndex() );
               			lhs = new AndDescr(); 
               			rule.setLhs( lhs ); 
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:477:3: ( rule_attributes[$rule] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:3: ( rule_attributes[$rule] )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -1599,9 +1667,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:477:3: rule_attributes[$rule]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:3: rule_attributes[$rule]
                     {
-                    pushFollow(FOLLOW_rule_attributes_in_rule963);
+                    pushFollow(FOLLOW_rule_attributes_in_rule1022);
                     rule_attributes(rule);
                     _fsp--;
                     if (failed) return rule;
@@ -1611,7 +1679,7 @@
 
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:478:3: ( WHEN ( ':' )? normal_lhs_block[lhs] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:495:3: ( WHEN ( ':' )? normal_lhs_block[lhs] )?
             int alt21=2;
             int LA21_0 = input.LA(1);
 
@@ -1620,22 +1688,22 @@
             }
             switch (alt21) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:479:4: WHEN ( ':' )? normal_lhs_block[lhs]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:4: WHEN ( ':' )? normal_lhs_block[lhs]
                     {
-                    WHEN12=(Token)input.LT(1);
-                    match(input,WHEN,FOLLOW_WHEN_in_rule975); if (failed) return rule;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:479:9: ( ':' )?
+                    WHEN13=(Token)input.LT(1);
+                    match(input,WHEN,FOLLOW_WHEN_in_rule1034); if (failed) return rule;
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:9: ( ':' )?
                     int alt20=2;
                     int LA20_0 = input.LA(1);
 
-                    if ( (LA20_0==74) ) {
+                    if ( (LA20_0==76) ) {
                         alt20=1;
                     }
                     switch (alt20) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:479:9: ':'
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:9: ':'
                             {
-                            match(input,74,FOLLOW_74_in_rule977); if (failed) return rule;
+                            match(input,76,FOLLOW_76_in_rule1036); if (failed) return rule;
 
                             }
                             break;
@@ -1645,11 +1713,11 @@
                     if ( backtracking==0 ) {
                        
                       				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-                      				lhs.setLocation( offset(WHEN12.getLine()), WHEN12.getCharPositionInLine() );
-                      				lhs.setStartCharacter( ((CommonToken)WHEN12).getStartIndex() );
+                      				lhs.setLocation( offset(WHEN13.getLine()), WHEN13.getCharPositionInLine() );
+                      				lhs.setStartCharacter( ((CommonToken)WHEN13).getStartIndex() );
                       			
                     }
-                    pushFollow(FOLLOW_normal_lhs_block_in_rule988);
+                    pushFollow(FOLLOW_normal_lhs_block_in_rule1047);
                     normal_lhs_block(lhs);
                     _fsp--;
                     if (failed) return rule;
@@ -1659,7 +1727,7 @@
 
             }
 
-            pushFollow(FOLLOW_rhs_chunk_in_rule998);
+            pushFollow(FOLLOW_rhs_chunk_in_rule1057);
             rhs_chunk(rule);
             _fsp--;
             if (failed) return rule;
@@ -1679,16 +1747,16 @@
 
 
     // $ANTLR start rule_attributes
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:492:1: rule_attributes[RuleDescr rule] : ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:509:1: rule_attributes[RuleDescr rule] : ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* ;
     public final void rule_attributes(RuleDescr rule) throws RecognitionException {
         AttributeDescr attr = null;
 
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:493:2: ( ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:2: ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:510:2: ( ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:2: ( ATTRIBUTES ':' )? attr= rule_attribute ( ( ',' )? attr= rule_attribute )*
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:2: ( ATTRIBUTES ':' )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:2: ( ATTRIBUTES ':' )?
             int alt22=2;
             int LA22_0 = input.LA(1);
 
@@ -1697,24 +1765,24 @@
             }
             switch (alt22) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:494:4: ATTRIBUTES ':'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:4: ATTRIBUTES ':'
                     {
-                    match(input,ATTRIBUTES,FOLLOW_ATTRIBUTES_in_rule_attributes1018); if (failed) return ;
-                    match(input,74,FOLLOW_74_in_rule_attributes1020); if (failed) return ;
+                    match(input,ATTRIBUTES,FOLLOW_ATTRIBUTES_in_rule_attributes1077); if (failed) return ;
+                    match(input,76,FOLLOW_76_in_rule_attributes1079); if (failed) return ;
 
                     }
                     break;
 
             }
 
-            pushFollow(FOLLOW_rule_attribute_in_rule_attributes1028);
+            pushFollow(FOLLOW_rule_attribute_in_rule_attributes1087);
             attr=rule_attribute();
             _fsp--;
             if (failed) return ;
             if ( backtracking==0 ) {
                rule.addAttribute( attr ); 
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:2: ( ( ',' )? attr= rule_attribute )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:2: ( ( ',' )? attr= rule_attribute )*
             loop24:
             do {
                 int alt24=2;
@@ -1727,9 +1795,9 @@
 
                 switch (alt24) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:4: ( ',' )? attr= rule_attribute
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:4: ( ',' )? attr= rule_attribute
             	    {
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:4: ( ',' )?
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:4: ( ',' )?
             	    int alt23=2;
             	    int LA23_0 = input.LA(1);
 
@@ -1738,16 +1806,16 @@
             	    }
             	    switch (alt23) {
             	        case 1 :
-            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:496:4: ','
+            	            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:4: ','
             	            {
-            	            match(input,COMMA,FOLLOW_COMMA_in_rule_attributes1035); if (failed) return ;
+            	            match(input,COMMA,FOLLOW_COMMA_in_rule_attributes1094); if (failed) return ;
 
             	            }
             	            break;
 
             	    }
 
-            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes1040);
+            	    pushFollow(FOLLOW_rule_attribute_in_rule_attributes1099);
             	    attr=rule_attribute();
             	    _fsp--;
             	    if (failed) return ;
@@ -1779,7 +1847,7 @@
 
 
     // $ANTLR start rule_attribute
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:501:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:518:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );
     public final AttributeDescr rule_attribute() throws RecognitionException {
         AttributeDescr attr = null;
 
@@ -1790,7 +1858,7 @@
         		attr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:2: (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:525:2: (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect )
             int alt25=12;
             switch ( input.LA(1) ) {
             case SALIENCE:
@@ -1856,16 +1924,16 @@
             default:
                 if (backtracking>0) {failed=true; return attr;}
                 NoViableAltException nvae =
-                    new NoViableAltException("501:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );", 25, 0, input);
+                    new NoViableAltException("518:1: rule_attribute returns [AttributeDescr attr] : (a= salience | a= no_loop | a= agenda_group | a= duration | a= activation_group | a= auto_focus | a= date_effective | a= date_expires | a= enabled | a= ruleflow_group | a= lock_on_active | a= dialect );", 25, 0, input);
 
                 throw nvae;
             }
 
             switch (alt25) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:508:4: a= salience
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:525:4: a= salience
                     {
-                    pushFollow(FOLLOW_salience_in_rule_attribute1077);
+                    pushFollow(FOLLOW_salience_in_rule_attribute1136);
                     a=salience();
                     _fsp--;
                     if (failed) return attr;
@@ -1873,9 +1941,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:509:4: a= no_loop
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:526:4: a= no_loop
                     {
-                    pushFollow(FOLLOW_no_loop_in_rule_attribute1085);
+                    pushFollow(FOLLOW_no_loop_in_rule_attribute1144);
                     a=no_loop();
                     _fsp--;
                     if (failed) return attr;
@@ -1883,9 +1951,9 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:510:4: a= agenda_group
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:527:4: a= agenda_group
                     {
-                    pushFollow(FOLLOW_agenda_group_in_rule_attribute1094);
+                    pushFollow(FOLLOW_agenda_group_in_rule_attribute1153);
                     a=agenda_group();
                     _fsp--;
                     if (failed) return attr;
@@ -1893,9 +1961,9 @@
                     }
                     break;
                 case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:511:4: a= duration
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:528:4: a= duration
                     {
-                    pushFollow(FOLLOW_duration_in_rule_attribute1103);
+                    pushFollow(FOLLOW_duration_in_rule_attribute1162);
                     a=duration();
                     _fsp--;
                     if (failed) return attr;
@@ -1903,9 +1971,9 @@
                     }
                     break;
                 case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:512:4: a= activation_group
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:529:4: a= activation_group
                     {
-                    pushFollow(FOLLOW_activation_group_in_rule_attribute1112);
+                    pushFollow(FOLLOW_activation_group_in_rule_attribute1171);
                     a=activation_group();
                     _fsp--;
                     if (failed) return attr;
@@ -1913,9 +1981,9 @@
                     }
                     break;
                 case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:513:4: a= auto_focus
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:530:4: a= auto_focus
                     {
-                    pushFollow(FOLLOW_auto_focus_in_rule_attribute1120);
+                    pushFollow(FOLLOW_auto_focus_in_rule_attribute1179);
                     a=auto_focus();
                     _fsp--;
                     if (failed) return attr;
@@ -1923,9 +1991,9 @@
                     }
                     break;
                 case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:514:4: a= date_effective
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:531:4: a= date_effective
                     {
-                    pushFollow(FOLLOW_date_effective_in_rule_attribute1128);
+                    pushFollow(FOLLOW_date_effective_in_rule_attribute1187);
                     a=date_effective();
                     _fsp--;
                     if (failed) return attr;
@@ -1933,9 +2001,9 @@
                     }
                     break;
                 case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:515:4: a= date_expires
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:532:4: a= date_expires
                     {
-                    pushFollow(FOLLOW_date_expires_in_rule_attribute1136);
+                    pushFollow(FOLLOW_date_expires_in_rule_attribute1195);
                     a=date_expires();
                     _fsp--;
                     if (failed) return attr;
@@ -1943,9 +2011,9 @@
                     }
                     break;
                 case 9 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:516:4: a= enabled
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:533:4: a= enabled
                     {
-                    pushFollow(FOLLOW_enabled_in_rule_attribute1144);
+                    pushFollow(FOLLOW_enabled_in_rule_attribute1203);
                     a=enabled();
                     _fsp--;
                     if (failed) return attr;
@@ -1953,9 +2021,9 @@
                     }
                     break;
                 case 10 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:517:4: a= ruleflow_group
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:534:4: a= ruleflow_group
                     {
-                    pushFollow(FOLLOW_ruleflow_group_in_rule_attribute1152);
+                    pushFollow(FOLLOW_ruleflow_group_in_rule_attribute1211);
                     a=ruleflow_group();
                     _fsp--;
                     if (failed) return attr;
@@ -1963,9 +2031,9 @@
                     }
                     break;
                 case 11 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:518:4: a= lock_on_active
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:535:4: a= lock_on_active
                     {
-                    pushFollow(FOLLOW_lock_on_active_in_rule_attribute1160);
+                    pushFollow(FOLLOW_lock_on_active_in_rule_attribute1219);
                     a=lock_on_active();
                     _fsp--;
                     if (failed) return attr;
@@ -1973,9 +2041,9 @@
                     }
                     break;
                 case 12 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:519:4: a= dialect
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:536:4: a= dialect
                     {
-                    pushFollow(FOLLOW_dialect_in_rule_attribute1167);
+                    pushFollow(FOLLOW_dialect_in_rule_attribute1226);
                     a=dialect();
                     _fsp--;
                     if (failed) return attr;
@@ -2002,30 +2070,30 @@
 
 
     // $ANTLR start date_effective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:522:1: date_effective returns [AttributeDescr descr] : DATE_EFFECTIVE STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:539:1: date_effective returns [AttributeDescr descr] : DATE_EFFECTIVE STRING ;
     public final AttributeDescr date_effective() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING13=null;
-        Token DATE_EFFECTIVE14=null;
+        Token STRING14=null;
+        Token DATE_EFFECTIVE15=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:526:2: ( DATE_EFFECTIVE STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:527:3: DATE_EFFECTIVE STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:543:2: ( DATE_EFFECTIVE STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:544:3: DATE_EFFECTIVE STRING
             {
-            DATE_EFFECTIVE14=(Token)input.LT(1);
-            match(input,DATE_EFFECTIVE,FOLLOW_DATE_EFFECTIVE_in_date_effective1193); if (failed) return descr;
-            STRING13=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_date_effective1195); if (failed) return descr;
+            DATE_EFFECTIVE15=(Token)input.LT(1);
+            match(input,DATE_EFFECTIVE,FOLLOW_DATE_EFFECTIVE_in_date_effective1252); if (failed) return descr;
+            STRING14=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_date_effective1254); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "date-effective", getString( STRING13.getText() ) );
-              			descr.setLocation( offset( DATE_EFFECTIVE14.getLine() ), DATE_EFFECTIVE14.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DATE_EFFECTIVE14).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING13).getStopIndex() );
+              			descr = new AttributeDescr( "date-effective", getString( STRING14.getText() ) );
+              			descr.setLocation( offset( DATE_EFFECTIVE15.getLine() ), DATE_EFFECTIVE15.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)DATE_EFFECTIVE15).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING14).getStopIndex() );
               		
             }
 
@@ -2044,30 +2112,30 @@
 
 
     // $ANTLR start date_expires
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:537:1: date_expires returns [AttributeDescr descr] : DATE_EXPIRES STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:1: date_expires returns [AttributeDescr descr] : DATE_EXPIRES STRING ;
     public final AttributeDescr date_expires() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING15=null;
-        Token DATE_EXPIRES16=null;
+        Token STRING16=null;
+        Token DATE_EXPIRES17=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:541:2: ( DATE_EXPIRES STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:541:4: DATE_EXPIRES STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:558:2: ( DATE_EXPIRES STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:558:4: DATE_EXPIRES STRING
             {
-            DATE_EXPIRES16=(Token)input.LT(1);
-            match(input,DATE_EXPIRES,FOLLOW_DATE_EXPIRES_in_date_expires1224); if (failed) return descr;
-            STRING15=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_date_expires1226); if (failed) return descr;
+            DATE_EXPIRES17=(Token)input.LT(1);
+            match(input,DATE_EXPIRES,FOLLOW_DATE_EXPIRES_in_date_expires1283); if (failed) return descr;
+            STRING16=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_date_expires1285); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "date-expires", getString( STRING15.getText() ) );
-              			descr.setLocation( offset(DATE_EXPIRES16.getLine()), DATE_EXPIRES16.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DATE_EXPIRES16).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING15).getStopIndex() );
+              			descr = new AttributeDescr( "date-expires", getString( STRING16.getText() ) );
+              			descr.setLocation( offset(DATE_EXPIRES17.getLine()), DATE_EXPIRES17.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)DATE_EXPIRES17).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING16).getStopIndex() );
               		
             }
 
@@ -2086,30 +2154,30 @@
 
 
     // $ANTLR start enabled
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:550:1: enabled returns [AttributeDescr descr] : ENABLED BOOL ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:567:1: enabled returns [AttributeDescr descr] : ENABLED BOOL ;
     public final AttributeDescr enabled() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token BOOL17=null;
-        Token ENABLED18=null;
+        Token BOOL18=null;
+        Token ENABLED19=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:2: ( ENABLED BOOL )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:554:5: ENABLED BOOL
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:571:2: ( ENABLED BOOL )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:571:5: ENABLED BOOL
             {
-            ENABLED18=(Token)input.LT(1);
-            match(input,ENABLED,FOLLOW_ENABLED_in_enabled1255); if (failed) return descr;
-            BOOL17=(Token)input.LT(1);
-            match(input,BOOL,FOLLOW_BOOL_in_enabled1257); if (failed) return descr;
+            ENABLED19=(Token)input.LT(1);
+            match(input,ENABLED,FOLLOW_ENABLED_in_enabled1314); if (failed) return descr;
+            BOOL18=(Token)input.LT(1);
+            match(input,BOOL,FOLLOW_BOOL_in_enabled1316); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              				descr = new AttributeDescr( "enabled", BOOL17.getText() );
-              				descr.setLocation( offset(ENABLED18.getLine()), ENABLED18.getCharPositionInLine() );
-              				descr.setStartCharacter( ((CommonToken)ENABLED18).getStartIndex() );
-              				descr.setEndCharacter( ((CommonToken)BOOL17).getStopIndex() );
+              				descr = new AttributeDescr( "enabled", BOOL18.getText() );
+              				descr.setLocation( offset(ENABLED19.getLine()), ENABLED19.getCharPositionInLine() );
+              				descr.setStartCharacter( ((CommonToken)ENABLED19).getStartIndex() );
+              				descr.setEndCharacter( ((CommonToken)BOOL18).getStopIndex() );
               			
             }
 
@@ -2128,12 +2196,12 @@
 
 
     // $ANTLR start salience
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:563:1: salience returns [AttributeDescr descr] : SALIENCE ( INT | txt= paren_chunk ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:580:1: salience returns [AttributeDescr descr] : SALIENCE ( INT | txt= paren_chunk ) ;
     public final AttributeDescr salience() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token SALIENCE19=null;
-        Token INT20=null;
+        Token SALIENCE20=null;
+        Token INT21=null;
         paren_chunk_return txt = null;
 
 
@@ -2141,19 +2209,19 @@
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:567:2: ( SALIENCE ( INT | txt= paren_chunk ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:568:3: SALIENCE ( INT | txt= paren_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:584:2: ( SALIENCE ( INT | txt= paren_chunk ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:585:3: SALIENCE ( INT | txt= paren_chunk )
             {
-            SALIENCE19=(Token)input.LT(1);
-            match(input,SALIENCE,FOLLOW_SALIENCE_in_salience1290); if (failed) return descr;
+            SALIENCE20=(Token)input.LT(1);
+            match(input,SALIENCE,FOLLOW_SALIENCE_in_salience1349); if (failed) return descr;
             if ( backtracking==0 ) {
 
               			descr = new AttributeDescr( "salience" );
-              			descr.setLocation( offset(SALIENCE19.getLine()), SALIENCE19.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)SALIENCE19).getStartIndex() );
+              			descr.setLocation( offset(SALIENCE20.getLine()), SALIENCE20.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)SALIENCE20).getStartIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:574:3: ( INT | txt= paren_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:591:3: ( INT | txt= paren_chunk )
             int alt26=2;
             int LA26_0 = input.LA(1);
 
@@ -2166,29 +2234,29 @@
             else {
                 if (backtracking>0) {failed=true; return descr;}
                 NoViableAltException nvae =
-                    new NoViableAltException("574:3: ( INT | txt= paren_chunk )", 26, 0, input);
+                    new NoViableAltException("591:3: ( INT | txt= paren_chunk )", 26, 0, input);
 
                 throw nvae;
             }
             switch (alt26) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:574:5: INT
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:591:5: INT
                     {
-                    INT20=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_salience1301); if (failed) return descr;
+                    INT21=(Token)input.LT(1);
+                    match(input,INT,FOLLOW_INT_in_salience1360); if (failed) return descr;
                     if ( backtracking==0 ) {
 
-                      			descr.setValue( INT20.getText() );
-                      			descr.setEndCharacter( ((CommonToken)INT20).getStopIndex() );
+                      			descr.setValue( INT21.getText() );
+                      			descr.setEndCharacter( ((CommonToken)INT21).getStopIndex() );
                       		
                     }
 
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:579:5: txt= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:596:5: txt= paren_chunk
                     {
-                    pushFollow(FOLLOW_paren_chunk_in_salience1316);
+                    pushFollow(FOLLOW_paren_chunk_in_salience1375);
                     txt=paren_chunk();
                     _fsp--;
                     if (failed) return descr;
@@ -2220,31 +2288,31 @@
 
 
     // $ANTLR start no_loop
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:587:1: no_loop returns [AttributeDescr descr] : NO_LOOP ( BOOL )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:604:1: no_loop returns [AttributeDescr descr] : NO_LOOP ( BOOL )? ;
     public final AttributeDescr no_loop() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token NO_LOOP21=null;
-        Token BOOL22=null;
+        Token NO_LOOP22=null;
+        Token BOOL23=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:591:2: ( NO_LOOP ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:591:4: NO_LOOP ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:2: ( NO_LOOP ( BOOL )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:608:4: NO_LOOP ( BOOL )?
             {
-            NO_LOOP21=(Token)input.LT(1);
-            match(input,NO_LOOP,FOLLOW_NO_LOOP_in_no_loop1346); if (failed) return descr;
+            NO_LOOP22=(Token)input.LT(1);
+            match(input,NO_LOOP,FOLLOW_NO_LOOP_in_no_loop1405); if (failed) return descr;
             if ( backtracking==0 ) {
 
               			descr = new AttributeDescr( "no-loop", "true" );
-              			descr.setLocation( offset(NO_LOOP21.getLine()), NO_LOOP21.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)NO_LOOP21).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)NO_LOOP21).getStopIndex() );
+              			descr.setLocation( offset(NO_LOOP22.getLine()), NO_LOOP22.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)NO_LOOP22).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)NO_LOOP22).getStopIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:598:3: ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:615:3: ( BOOL )?
             int alt27=2;
             int LA27_0 = input.LA(1);
 
@@ -2253,14 +2321,14 @@
             }
             switch (alt27) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:598:5: BOOL
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:615:5: BOOL
                     {
-                    BOOL22=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_no_loop1359); if (failed) return descr;
+                    BOOL23=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_no_loop1418); if (failed) return descr;
                     if ( backtracking==0 ) {
 
-                      				descr.setValue( BOOL22.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL22).getStopIndex() );
+                      				descr.setValue( BOOL23.getText() );
+                      				descr.setEndCharacter( ((CommonToken)BOOL23).getStopIndex() );
                       			
                     }
 
@@ -2285,31 +2353,31 @@
 
 
     // $ANTLR start auto_focus
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:606:1: auto_focus returns [AttributeDescr descr] : AUTO_FOCUS ( BOOL )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:623:1: auto_focus returns [AttributeDescr descr] : AUTO_FOCUS ( BOOL )? ;
     public final AttributeDescr auto_focus() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token AUTO_FOCUS23=null;
-        Token BOOL24=null;
+        Token AUTO_FOCUS24=null;
+        Token BOOL25=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:610:2: ( AUTO_FOCUS ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:610:4: AUTO_FOCUS ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:2: ( AUTO_FOCUS ( BOOL )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:627:4: AUTO_FOCUS ( BOOL )?
             {
-            AUTO_FOCUS23=(Token)input.LT(1);
-            match(input,AUTO_FOCUS,FOLLOW_AUTO_FOCUS_in_auto_focus1394); if (failed) return descr;
+            AUTO_FOCUS24=(Token)input.LT(1);
+            match(input,AUTO_FOCUS,FOLLOW_AUTO_FOCUS_in_auto_focus1453); if (failed) return descr;
             if ( backtracking==0 ) {
 
               			descr = new AttributeDescr( "auto-focus", "true" );
-              			descr.setLocation( offset(AUTO_FOCUS23.getLine()), AUTO_FOCUS23.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)AUTO_FOCUS23).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)AUTO_FOCUS23).getStopIndex() );
+              			descr.setLocation( offset(AUTO_FOCUS24.getLine()), AUTO_FOCUS24.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)AUTO_FOCUS24).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)AUTO_FOCUS24).getStopIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:617:3: ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:3: ( BOOL )?
             int alt28=2;
             int LA28_0 = input.LA(1);
 
@@ -2318,14 +2386,14 @@
             }
             switch (alt28) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:617:5: BOOL
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:634:5: BOOL
                     {
-                    BOOL24=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_auto_focus1407); if (failed) return descr;
+                    BOOL25=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_auto_focus1466); if (failed) return descr;
                     if ( backtracking==0 ) {
 
-                      				descr.setValue( BOOL24.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL24).getStopIndex() );
+                      				descr.setValue( BOOL25.getText() );
+                      				descr.setEndCharacter( ((CommonToken)BOOL25).getStopIndex() );
                       			
                     }
 
@@ -2350,30 +2418,30 @@
 
 
     // $ANTLR start activation_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:625:1: activation_group returns [AttributeDescr descr] : ACTIVATION_GROUP STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:1: activation_group returns [AttributeDescr descr] : ACTIVATION_GROUP STRING ;
     public final AttributeDescr activation_group() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING25=null;
-        Token ACTIVATION_GROUP26=null;
+        Token STRING26=null;
+        Token ACTIVATION_GROUP27=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:629:2: ( ACTIVATION_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:629:4: ACTIVATION_GROUP STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:646:2: ( ACTIVATION_GROUP STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:646:4: ACTIVATION_GROUP STRING
             {
-            ACTIVATION_GROUP26=(Token)input.LT(1);
-            match(input,ACTIVATION_GROUP,FOLLOW_ACTIVATION_GROUP_in_activation_group1443); if (failed) return descr;
-            STRING25=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_activation_group1445); if (failed) return descr;
+            ACTIVATION_GROUP27=(Token)input.LT(1);
+            match(input,ACTIVATION_GROUP,FOLLOW_ACTIVATION_GROUP_in_activation_group1502); if (failed) return descr;
+            STRING26=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_activation_group1504); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "activation-group", getString( STRING25.getText() ) );
-              			descr.setLocation( offset(ACTIVATION_GROUP26.getLine()), ACTIVATION_GROUP26.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)ACTIVATION_GROUP26).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING25).getStopIndex() );
+              			descr = new AttributeDescr( "activation-group", getString( STRING26.getText() ) );
+              			descr.setLocation( offset(ACTIVATION_GROUP27.getLine()), ACTIVATION_GROUP27.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)ACTIVATION_GROUP27).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING26).getStopIndex() );
               		
             }
 
@@ -2392,30 +2460,30 @@
 
 
     // $ANTLR start ruleflow_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:638:1: ruleflow_group returns [AttributeDescr descr] : RULEFLOW_GROUP STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:655:1: ruleflow_group returns [AttributeDescr descr] : RULEFLOW_GROUP STRING ;
     public final AttributeDescr ruleflow_group() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING27=null;
-        Token RULEFLOW_GROUP28=null;
+        Token STRING28=null;
+        Token RULEFLOW_GROUP29=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:2: ( RULEFLOW_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:642:4: RULEFLOW_GROUP STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:659:2: ( RULEFLOW_GROUP STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:659:4: RULEFLOW_GROUP STRING
             {
-            RULEFLOW_GROUP28=(Token)input.LT(1);
-            match(input,RULEFLOW_GROUP,FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1473); if (failed) return descr;
-            STRING27=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_ruleflow_group1475); if (failed) return descr;
+            RULEFLOW_GROUP29=(Token)input.LT(1);
+            match(input,RULEFLOW_GROUP,FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1532); if (failed) return descr;
+            STRING28=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_ruleflow_group1534); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "ruleflow-group", getString( STRING27.getText() ) );
-              			descr.setLocation( offset(RULEFLOW_GROUP28.getLine()), RULEFLOW_GROUP28.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)RULEFLOW_GROUP28).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING27).getStopIndex() );
+              			descr = new AttributeDescr( "ruleflow-group", getString( STRING28.getText() ) );
+              			descr.setLocation( offset(RULEFLOW_GROUP29.getLine()), RULEFLOW_GROUP29.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)RULEFLOW_GROUP29).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING28).getStopIndex() );
               		
             }
 
@@ -2434,30 +2502,30 @@
 
 
     // $ANTLR start agenda_group
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:651:1: agenda_group returns [AttributeDescr descr] : AGENDA_GROUP STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:668:1: agenda_group returns [AttributeDescr descr] : AGENDA_GROUP STRING ;
     public final AttributeDescr agenda_group() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING29=null;
-        Token AGENDA_GROUP30=null;
+        Token STRING30=null;
+        Token AGENDA_GROUP31=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:655:2: ( AGENDA_GROUP STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:655:4: AGENDA_GROUP STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:672:2: ( AGENDA_GROUP STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:672:4: AGENDA_GROUP STRING
             {
-            AGENDA_GROUP30=(Token)input.LT(1);
-            match(input,AGENDA_GROUP,FOLLOW_AGENDA_GROUP_in_agenda_group1503); if (failed) return descr;
-            STRING29=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_agenda_group1505); if (failed) return descr;
+            AGENDA_GROUP31=(Token)input.LT(1);
+            match(input,AGENDA_GROUP,FOLLOW_AGENDA_GROUP_in_agenda_group1562); if (failed) return descr;
+            STRING30=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_agenda_group1564); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "agenda-group", getString( STRING29.getText() ) );
-              			descr.setLocation( offset(AGENDA_GROUP30.getLine()), AGENDA_GROUP30.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)AGENDA_GROUP30).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING29).getStopIndex() );
+              			descr = new AttributeDescr( "agenda-group", getString( STRING30.getText() ) );
+              			descr.setLocation( offset(AGENDA_GROUP31.getLine()), AGENDA_GROUP31.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)AGENDA_GROUP31).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING30).getStopIndex() );
               		
             }
 
@@ -2476,30 +2544,30 @@
 
 
     // $ANTLR start duration
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:664:1: duration returns [AttributeDescr descr] : DURATION INT ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:681:1: duration returns [AttributeDescr descr] : DURATION INT ;
     public final AttributeDescr duration() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token INT31=null;
-        Token DURATION32=null;
+        Token INT32=null;
+        Token DURATION33=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:668:2: ( DURATION INT )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:668:4: DURATION INT
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:685:2: ( DURATION INT )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:685:4: DURATION INT
             {
-            DURATION32=(Token)input.LT(1);
-            match(input,DURATION,FOLLOW_DURATION_in_duration1533); if (failed) return descr;
-            INT31=(Token)input.LT(1);
-            match(input,INT,FOLLOW_INT_in_duration1535); if (failed) return descr;
+            DURATION33=(Token)input.LT(1);
+            match(input,DURATION,FOLLOW_DURATION_in_duration1592); if (failed) return descr;
+            INT32=(Token)input.LT(1);
+            match(input,INT,FOLLOW_INT_in_duration1594); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "duration", INT31.getText() );
-              			descr.setLocation( offset(DURATION32.getLine()), DURATION32.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DURATION32).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)INT31).getStopIndex() );
+              			descr = new AttributeDescr( "duration", INT32.getText() );
+              			descr.setLocation( offset(DURATION33.getLine()), DURATION33.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)DURATION33).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)INT32).getStopIndex() );
               		
             }
 
@@ -2518,30 +2586,30 @@
 
 
     // $ANTLR start dialect
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:677:1: dialect returns [AttributeDescr descr] : DIALECT STRING ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:694:1: dialect returns [AttributeDescr descr] : DIALECT STRING ;
     public final AttributeDescr dialect() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token STRING33=null;
-        Token DIALECT34=null;
+        Token STRING34=null;
+        Token DIALECT35=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:681:2: ( DIALECT STRING )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:681:4: DIALECT STRING
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:698:2: ( DIALECT STRING )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:698:4: DIALECT STRING
             {
-            DIALECT34=(Token)input.LT(1);
-            match(input,DIALECT,FOLLOW_DIALECT_in_dialect1563); if (failed) return descr;
-            STRING33=(Token)input.LT(1);
-            match(input,STRING,FOLLOW_STRING_in_dialect1565); if (failed) return descr;
+            DIALECT35=(Token)input.LT(1);
+            match(input,DIALECT,FOLLOW_DIALECT_in_dialect1622); if (failed) return descr;
+            STRING34=(Token)input.LT(1);
+            match(input,STRING,FOLLOW_STRING_in_dialect1624); if (failed) return descr;
             if ( backtracking==0 ) {
 
-              			descr = new AttributeDescr( "dialect", getString( STRING33.getText() ) );
-              			descr.setLocation( offset(DIALECT34.getLine()), DIALECT34.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)DIALECT34).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)STRING33).getStopIndex() );
+              			descr = new AttributeDescr( "dialect", getString( STRING34.getText() ) );
+              			descr.setLocation( offset(DIALECT35.getLine()), DIALECT35.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)DIALECT35).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)STRING34).getStopIndex() );
               		
             }
 
@@ -2560,31 +2628,31 @@
 
 
     // $ANTLR start lock_on_active
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:690:1: lock_on_active returns [AttributeDescr descr] : LOCK_ON_ACTIVE ( BOOL )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:707:1: lock_on_active returns [AttributeDescr descr] : LOCK_ON_ACTIVE ( BOOL )? ;
     public final AttributeDescr lock_on_active() throws RecognitionException {
         AttributeDescr descr = null;
 
-        Token LOCK_ON_ACTIVE35=null;
-        Token BOOL36=null;
+        Token LOCK_ON_ACTIVE36=null;
+        Token BOOL37=null;
 
 
         		descr = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:694:2: ( LOCK_ON_ACTIVE ( BOOL )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:694:4: LOCK_ON_ACTIVE ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:711:2: ( LOCK_ON_ACTIVE ( BOOL )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:711:4: LOCK_ON_ACTIVE ( BOOL )?
             {
-            LOCK_ON_ACTIVE35=(Token)input.LT(1);
-            match(input,LOCK_ON_ACTIVE,FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1597); if (failed) return descr;
+            LOCK_ON_ACTIVE36=(Token)input.LT(1);
+            match(input,LOCK_ON_ACTIVE,FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1656); if (failed) return descr;
             if ( backtracking==0 ) {
 
               			descr = new AttributeDescr( "lock-on-active", "true" );
-              			descr.setLocation( offset(LOCK_ON_ACTIVE35.getLine()), LOCK_ON_ACTIVE35.getCharPositionInLine() );
-              			descr.setStartCharacter( ((CommonToken)LOCK_ON_ACTIVE35).getStartIndex() );
-              			descr.setEndCharacter( ((CommonToken)LOCK_ON_ACTIVE35).getStopIndex() );
+              			descr.setLocation( offset(LOCK_ON_ACTIVE36.getLine()), LOCK_ON_ACTIVE36.getCharPositionInLine() );
+              			descr.setStartCharacter( ((CommonToken)LOCK_ON_ACTIVE36).getStartIndex() );
+              			descr.setEndCharacter( ((CommonToken)LOCK_ON_ACTIVE36).getStopIndex() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:701:3: ( BOOL )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:718:3: ( BOOL )?
             int alt29=2;
             int LA29_0 = input.LA(1);
 
@@ -2593,14 +2661,14 @@
             }
             switch (alt29) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:701:5: BOOL
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:718:5: BOOL
                     {
-                    BOOL36=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_lock_on_active1610); if (failed) return descr;
+                    BOOL37=(Token)input.LT(1);
+                    match(input,BOOL,FOLLOW_BOOL_in_lock_on_active1669); if (failed) return descr;
                     if ( backtracking==0 ) {
 
-                      				descr.setValue( BOOL36.getText() );
-                      				descr.setEndCharacter( ((CommonToken)BOOL36).getStopIndex() );
+                      				descr.setValue( BOOL37.getText() );
+                      				descr.setEndCharacter( ((CommonToken)BOOL37).getStopIndex() );
                       			
                     }
 
@@ -2625,7 +2693,7 @@
 
 
     // $ANTLR start normal_lhs_block
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:709:1: normal_lhs_block[AndDescr descr] : (d= lhs[$descr] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:726:1: normal_lhs_block[AndDescr descr] : (d= lhs[$descr] )* ;
     public final void normal_lhs_block(AndDescr descr) throws RecognitionException {
         BaseDescr d = null;
 
@@ -2634,10 +2702,10 @@
         		location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:713:2: ( (d= lhs[$descr] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:714:3: (d= lhs[$descr] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:730:2: ( (d= lhs[$descr] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:731:3: (d= lhs[$descr] )*
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:714:3: (d= lhs[$descr] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:731:3: (d= lhs[$descr] )*
             loop30:
             do {
                 int alt30=2;
@@ -2650,9 +2718,9 @@
 
                 switch (alt30) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:714:5: d= lhs[$descr]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:731:5: d= lhs[$descr]
             	    {
-            	    pushFollow(FOLLOW_lhs_in_normal_lhs_block1649);
+            	    pushFollow(FOLLOW_lhs_in_normal_lhs_block1708);
             	    d=lhs(descr);
             	    _fsp--;
             	    if (failed) return ;
@@ -2684,7 +2752,7 @@
 
 
     // $ANTLR start lhs
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:720:1: lhs[ConditionalElementDescr ce] returns [BaseDescr d] : l= lhs_or ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:737:1: lhs[ConditionalElementDescr ce] returns [BaseDescr d] : l= lhs_or ;
     public final BaseDescr lhs(ConditionalElementDescr ce) throws RecognitionException {
         BaseDescr d = null;
 
@@ -2695,10 +2763,10 @@
         		d =null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:724:2: (l= lhs_or )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:724:4: l= lhs_or
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:741:2: (l= lhs_or )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:741:4: l= lhs_or
             {
-            pushFollow(FOLLOW_lhs_or_in_lhs1686);
+            pushFollow(FOLLOW_lhs_or_in_lhs1745);
             l=lhs_or();
             _fsp--;
             if (failed) return d;
@@ -2721,7 +2789,7 @@
 
 
     // $ANTLR start lhs_or
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:728:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:745:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );
     public final BaseDescr lhs_or() throws RecognitionException {
         BaseDescr d = null;
 
@@ -2737,23 +2805,23 @@
         		OrDescr or = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:733:2: ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:750:2: ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* )
             int alt33=2;
             int LA33_0 = input.LA(1);
 
             if ( (LA33_0==LEFT_PAREN) ) {
                 int LA33_1 = input.LA(2);
 
-                if ( (LA33_1==ID||LA33_1==LEFT_PAREN||LA33_1==AND||(LA33_1>=EXISTS && LA33_1<=FORALL)) ) {
+                if ( (LA33_1==OR) ) {
+                    alt33=1;
+                }
+                else if ( (LA33_1==ID||LA33_1==LEFT_PAREN||LA33_1==AND||(LA33_1>=EXISTS && LA33_1<=FORALL)) ) {
                     alt33=2;
                 }
-                else if ( (LA33_1==OR) ) {
-                    alt33=1;
-                }
                 else {
                     if (backtracking>0) {failed=true; return d;}
                     NoViableAltException nvae =
-                        new NoViableAltException("728:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 33, 1, input);
+                        new NoViableAltException("745:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 33, 1, input);
 
                     throw nvae;
                 }
@@ -2764,16 +2832,16 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("728:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 33, 0, input);
+                    new NoViableAltException("745:1: lhs_or returns [BaseDescr d] : ( LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN | left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )* );", 33, 0, input);
 
                 throw nvae;
             }
             switch (alt33) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:733:4: LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:750:4: LEFT_PAREN OR (lhsand= lhs_and )+ RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_or1711); if (failed) return d;
-                    match(input,OR,FOLLOW_OR_in_lhs_or1713); if (failed) return d;
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_or1770); if (failed) return d;
+                    match(input,OR,FOLLOW_OR_in_lhs_or1772); if (failed) return d;
                     if ( backtracking==0 ) {
 
                       			or = new OrDescr();
@@ -2781,7 +2849,7 @@
                       			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
                       		
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:739:3: (lhsand= lhs_and )+
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:756:3: (lhsand= lhs_and )+
                     int cnt31=0;
                     loop31:
                     do {
@@ -2795,9 +2863,9 @@
 
                         switch (alt31) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:739:5: lhsand= lhs_and
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:756:5: lhsand= lhs_and
                     	    {
-                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1726);
+                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1785);
                     	    lhsand=lhs_and();
                     	    _fsp--;
                     	    if (failed) return d;
@@ -2820,21 +2888,21 @@
                         cnt31++;
                     } while (true);
 
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_or1737); if (failed) return d;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_or1796); if (failed) return d;
 
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:745:10: left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:762:10: left= lhs_and ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
                     {
-                    pushFollow(FOLLOW_lhs_and_in_lhs_or1755);
+                    pushFollow(FOLLOW_lhs_and_in_lhs_or1814);
                     left=lhs_and();
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
                        d = left; 
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:746:3: ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:763:3: ( ( OR | DOUBLE_PIPE ) right= lhs_and )*
                     loop32:
                     do {
                         int alt32=2;
@@ -2847,7 +2915,7 @@
 
                         switch (alt32) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:746:5: ( OR | DOUBLE_PIPE ) right= lhs_and
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:763:5: ( OR | DOUBLE_PIPE ) right= lhs_and
                     	    {
                     	    if ( (input.LA(1)>=OR && input.LA(1)<=DOUBLE_PIPE) ) {
                     	        input.consume();
@@ -2857,7 +2925,7 @@
                     	        if (backtracking>0) {failed=true; return d;}
                     	        MismatchedSetException mse =
                     	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_or1763);    throw mse;
+                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_or1822);    throw mse;
                     	    }
 
                     	    if ( backtracking==0 ) {
@@ -2865,7 +2933,7 @@
                     	      				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
                     	      			
                     	    }
-                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1779);
+                    	    pushFollow(FOLLOW_lhs_and_in_lhs_or1838);
                     	    right=lhs_and();
                     	    _fsp--;
                     	    if (failed) return d;
@@ -2907,7 +2975,7 @@
 
 
     // $ANTLR start lhs_and
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:763:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:780:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );
     public final BaseDescr lhs_and() throws RecognitionException {
         BaseDescr d = null;
 
@@ -2923,7 +2991,7 @@
         		AndDescr and = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:768:2: ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:785:2: ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* )
             int alt36=2;
             int LA36_0 = input.LA(1);
 
@@ -2939,7 +3007,7 @@
                 else {
                     if (backtracking>0) {failed=true; return d;}
                     NoViableAltException nvae =
-                        new NoViableAltException("763:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 36, 1, input);
+                        new NoViableAltException("780:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 36, 1, input);
 
                     throw nvae;
                 }
@@ -2950,16 +3018,16 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("763:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 36, 0, input);
+                    new NoViableAltException("780:1: lhs_and returns [BaseDescr d] : ( LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN | left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )* );", 36, 0, input);
 
                 throw nvae;
             }
             switch (alt36) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:768:4: LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:785:4: LEFT_PAREN AND (lhsunary= lhs_unary )+ RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_and1810); if (failed) return d;
-                    match(input,AND,FOLLOW_AND_in_lhs_and1812); if (failed) return d;
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_and1869); if (failed) return d;
+                    match(input,AND,FOLLOW_AND_in_lhs_and1871); if (failed) return d;
                     if ( backtracking==0 ) {
 
                       			and = new AndDescr();
@@ -2967,7 +3035,7 @@
                       			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
                       		
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:774:3: (lhsunary= lhs_unary )+
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:791:3: (lhsunary= lhs_unary )+
                     int cnt34=0;
                     loop34:
                     do {
@@ -2981,9 +3049,9 @@
 
                         switch (alt34) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:774:4: lhsunary= lhs_unary
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:791:4: lhsunary= lhs_unary
                     	    {
-                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1824);
+                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1883);
                     	    lhsunary=lhs_unary();
                     	    _fsp--;
                     	    if (failed) return d;
@@ -3006,21 +3074,21 @@
                         cnt34++;
                     } while (true);
 
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_and1834); if (failed) return d;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_and1893); if (failed) return d;
 
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:780:10: left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:797:10: left= lhs_unary ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
                     {
-                    pushFollow(FOLLOW_lhs_unary_in_lhs_and1852);
+                    pushFollow(FOLLOW_lhs_unary_in_lhs_and1911);
                     left=lhs_unary();
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
                        d = left; 
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:781:3: ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:798:3: ( ( AND | DOUBLE_AMPER ) right= lhs_unary )*
                     loop35:
                     do {
                         int alt35=2;
@@ -3033,7 +3101,7 @@
 
                         switch (alt35) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:781:5: ( AND | DOUBLE_AMPER ) right= lhs_unary
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:798:5: ( AND | DOUBLE_AMPER ) right= lhs_unary
                     	    {
                     	    if ( (input.LA(1)>=AND && input.LA(1)<=DOUBLE_AMPER) ) {
                     	        input.consume();
@@ -3043,7 +3111,7 @@
                     	        if (backtracking>0) {failed=true; return d;}
                     	        MismatchedSetException mse =
                     	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_and1860);    throw mse;
+                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_lhs_and1919);    throw mse;
                     	    }
 
                     	    if ( backtracking==0 ) {
@@ -3051,7 +3119,7 @@
                     	      				location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_AND_OR );
                     	      			
                     	    }
-                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1876);
+                    	    pushFollow(FOLLOW_lhs_unary_in_lhs_and1935);
                     	    right=lhs_unary();
                     	    _fsp--;
                     	    if (failed) return d;
@@ -3093,7 +3161,7 @@
 
 
     // $ANTLR start lhs_unary
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:798:1: lhs_unary returns [BaseDescr d] : ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:815:1: lhs_unary returns [BaseDescr d] : ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon ;
     public final BaseDescr lhs_unary() throws RecognitionException {
         BaseDescr d = null;
 
@@ -3106,10 +3174,10 @@
         		d = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:2: ( ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:2: ( ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source ) opt_semicolon
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )
             int alt37=6;
             int LA37_0 = input.LA(1);
 
@@ -3134,15 +3202,15 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("802:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )", 37, 0, input);
+                    new NoViableAltException("819:4: ( ( EXISTS )=>u= lhs_exist | ( NOT )=>u= lhs_not | ( EVAL )=>u= lhs_eval | ( FORALL )=>u= lhs_forall | ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN | ps= pattern_source )", 37, 0, input);
 
                 throw nvae;
             }
             switch (alt37) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:6: ( EXISTS )=>u= lhs_exist
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:6: ( EXISTS )=>u= lhs_exist
                     {
-                    pushFollow(FOLLOW_lhs_exist_in_lhs_unary1921);
+                    pushFollow(FOLLOW_lhs_exist_in_lhs_unary1980);
                     u=lhs_exist();
                     _fsp--;
                     if (failed) return d;
@@ -3153,9 +3221,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:803:5: ( NOT )=>u= lhs_not
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:820:5: ( NOT )=>u= lhs_not
                     {
-                    pushFollow(FOLLOW_lhs_not_in_lhs_unary1939);
+                    pushFollow(FOLLOW_lhs_not_in_lhs_unary1998);
                     u=lhs_not();
                     _fsp--;
                     if (failed) return d;
@@ -3166,9 +3234,9 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:804:5: ( EVAL )=>u= lhs_eval
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:821:5: ( EVAL )=>u= lhs_eval
                     {
-                    pushFollow(FOLLOW_lhs_eval_in_lhs_unary1958);
+                    pushFollow(FOLLOW_lhs_eval_in_lhs_unary2017);
                     u=lhs_eval();
                     _fsp--;
                     if (failed) return d;
@@ -3179,9 +3247,9 @@
                     }
                     break;
                 case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:805:5: ( FORALL )=>u= lhs_forall
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:822:5: ( FORALL )=>u= lhs_forall
                     {
-                    pushFollow(FOLLOW_lhs_forall_in_lhs_unary1977);
+                    pushFollow(FOLLOW_lhs_forall_in_lhs_unary2036);
                     u=lhs_forall();
                     _fsp--;
                     if (failed) return d;
@@ -3192,14 +3260,14 @@
                     }
                     break;
                 case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:806:5: ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:823:5: ( LEFT_PAREN )=> LEFT_PAREN u= lhs_or RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_unary1994); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_unary1998);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_unary2053); if (failed) return d;
+                    pushFollow(FOLLOW_lhs_or_in_lhs_unary2057);
                     u=lhs_or();
                     _fsp--;
                     if (failed) return d;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_unary2000); if (failed) return d;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_unary2059); if (failed) return d;
                     if ( backtracking==0 ) {
                        d = u; 
                     }
@@ -3207,9 +3275,9 @@
                     }
                     break;
                 case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:807:5: ps= pattern_source
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:824:5: ps= pattern_source
                     {
-                    pushFollow(FOLLOW_pattern_source_in_lhs_unary2011);
+                    pushFollow(FOLLOW_pattern_source_in_lhs_unary2070);
                     ps=pattern_source();
                     _fsp--;
                     if (failed) return d;
@@ -3222,7 +3290,7 @@
 
             }
 
-            pushFollow(FOLLOW_opt_semicolon_in_lhs_unary2023);
+            pushFollow(FOLLOW_opt_semicolon_in_lhs_unary2082);
             opt_semicolon();
             _fsp--;
             if (failed) return d;
@@ -3242,7 +3310,7 @@
 
 
     // $ANTLR start pattern_source
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:812:1: pattern_source returns [BaseDescr d] : u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:829:1: pattern_source returns [BaseDescr d] : u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? ;
     public final BaseDescr pattern_source() throws RecognitionException {
         BaseDescr d = null;
 
@@ -3259,17 +3327,17 @@
         		d = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:816:2: (u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:817:3: u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:833:2: (u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:834:3: u= lhs_pattern ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
             {
-            pushFollow(FOLLOW_lhs_pattern_in_pattern_source2050);
+            pushFollow(FOLLOW_lhs_pattern_in_pattern_source2109);
             u=lhs_pattern();
             _fsp--;
             if (failed) return d;
             if ( backtracking==0 ) {
                d = u; 
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:818:3: ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:835:3: ( FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) ) )?
             int alt39=2;
             int LA39_0 = input.LA(1);
 
@@ -3278,16 +3346,16 @@
             }
             switch (alt39) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:4: FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:836:4: FROM ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
                     {
-                    match(input,FROM,FOLLOW_FROM_in_pattern_source2062); if (failed) return d;
+                    match(input,FROM,FOLLOW_FROM_in_pattern_source2121); if (failed) return d;
                     if ( backtracking==0 ) {
 
                       				location.setType(Location.LOCATION_LHS_FROM);
                       				location.setProperty(Location.LOCATION_FROM_CONTENT, "");
                       		        
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:824:11: ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:841:11: ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )
                     int alt38=3;
                     switch ( input.LA(1) ) {
                     case ACCUMULATE:
@@ -3303,6 +3371,7 @@
                     case PACKAGE:
                     case IMPORT:
                     case FUNCTION:
+                    case EVENT:
                     case ID:
                     case GLOBAL:
                     case QUERY:
@@ -3334,19 +3403,19 @@
                     default:
                         if (backtracking>0) {failed=true; return d;}
                         NoViableAltException nvae =
-                            new NoViableAltException("824:11: ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )", 38, 0, input);
+                            new NoViableAltException("841:11: ( options {k=1; } : (ac= accumulate_statement ) | (cs= collect_statement ) | (fm= from_statement ) )", 38, 0, input);
 
                         throw nvae;
                     }
 
                     switch (alt38) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:825:15: (ac= accumulate_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:842:15: (ac= accumulate_statement )
                             {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:825:15: (ac= accumulate_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:825:17: ac= accumulate_statement
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:842:15: (ac= accumulate_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:842:17: ac= accumulate_statement
                             {
-                            pushFollow(FOLLOW_accumulate_statement_in_pattern_source2118);
+                            pushFollow(FOLLOW_accumulate_statement_in_pattern_source2177);
                             ac=accumulate_statement();
                             _fsp--;
                             if (failed) return d;
@@ -3360,12 +3429,12 @@
                             }
                             break;
                         case 2 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:826:15: (cs= collect_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:15: (cs= collect_statement )
                             {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:826:15: (cs= collect_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:826:17: cs= collect_statement
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:15: (cs= collect_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:17: cs= collect_statement
                             {
-                            pushFollow(FOLLOW_collect_statement_in_pattern_source2141);
+                            pushFollow(FOLLOW_collect_statement_in_pattern_source2200);
                             cs=collect_statement();
                             _fsp--;
                             if (failed) return d;
@@ -3379,12 +3448,12 @@
                             }
                             break;
                         case 3 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:827:15: (fm= from_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:844:15: (fm= from_statement )
                             {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:827:15: (fm= from_statement )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:827:17: fm= from_statement
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:844:15: (fm= from_statement )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:844:17: fm= from_statement
                             {
-                            pushFollow(FOLLOW_from_statement_in_pattern_source2165);
+                            pushFollow(FOLLOW_from_statement_in_pattern_source2224);
                             fm=from_statement();
                             _fsp--;
                             if (failed) return d;
@@ -3422,12 +3491,12 @@
 
 
     // $ANTLR start lhs_exist
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:832:1: lhs_exist returns [BaseDescr d] : EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:849:1: lhs_exist returns [BaseDescr d] : EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
     public final BaseDescr lhs_exist() throws RecognitionException {
         BaseDescr d = null;
 
-        Token EXISTS37=null;
-        Token RIGHT_PAREN38=null;
+        Token EXISTS38=null;
+        Token RIGHT_PAREN39=null;
         BaseDescr or = null;
 
         BaseDescr pattern = null;
@@ -3437,20 +3506,20 @@
         		d = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:836:2: ( EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:836:4: EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:853:2: ( EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:853:4: EXISTS ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
             {
-            EXISTS37=(Token)input.LT(1);
-            match(input,EXISTS,FOLLOW_EXISTS_in_lhs_exist2208); if (failed) return d;
+            EXISTS38=(Token)input.LT(1);
+            match(input,EXISTS,FOLLOW_EXISTS_in_lhs_exist2267); if (failed) return d;
             if ( backtracking==0 ) {
 
               			d = new ExistsDescr( ); 
-              			d.setLocation( offset(EXISTS37.getLine()), EXISTS37.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)EXISTS37).getStartIndex() );
+              			d.setLocation( offset(EXISTS38.getLine()), EXISTS38.getCharPositionInLine() );
+              			d.setStartCharacter( ((CommonToken)EXISTS38).getStartIndex() );
               			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_EXISTS );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:860:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
             int alt40=2;
             int LA40_0 = input.LA(1);
 
@@ -3463,29 +3532,29 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("843:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 40, 0, input);
+                    new NoViableAltException("860:10: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 40, 0, input);
 
                 throw nvae;
             }
             switch (alt40) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:860:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:843:14: LEFT_PAREN or= lhs_or RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:860:12: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:860:14: LEFT_PAREN or= lhs_or RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_exist2228); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_exist2232);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_exist2287); if (failed) return d;
+                    pushFollow(FOLLOW_lhs_or_in_lhs_exist2291);
                     or=lhs_or();
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
                        if ( or != null ) ((ExistsDescr)d).addDescr( or ); 
                     }
-                    RIGHT_PAREN38=(Token)input.LT(1);
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_exist2262); if (failed) return d;
+                    RIGHT_PAREN39=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_exist2321); if (failed) return d;
                     if ( backtracking==0 ) {
-                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN38).getStopIndex() ); 
+                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN39).getStopIndex() ); 
                     }
 
                     }
@@ -3494,9 +3563,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:848:12: pattern= lhs_pattern
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:865:12: pattern= lhs_pattern
                     {
-                    pushFollow(FOLLOW_lhs_pattern_in_lhs_exist2312);
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs_exist2371);
                     pattern=lhs_pattern();
                     _fsp--;
                     if (failed) return d;
@@ -3530,12 +3599,12 @@
 
 
     // $ANTLR start lhs_not
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:858:1: lhs_not returns [NotDescr d] : NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:875:1: lhs_not returns [NotDescr d] : NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) ;
     public final NotDescr lhs_not() throws RecognitionException {
         NotDescr d = null;
 
-        Token NOT39=null;
-        Token RIGHT_PAREN40=null;
+        Token NOT40=null;
+        Token RIGHT_PAREN41=null;
         BaseDescr or = null;
 
         BaseDescr pattern = null;
@@ -3545,20 +3614,20 @@
         		d = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:862:2: ( NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:862:4: NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:879:2: ( NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:879:4: NOT ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
             {
-            NOT39=(Token)input.LT(1);
-            match(input,NOT,FOLLOW_NOT_in_lhs_not2364); if (failed) return d;
+            NOT40=(Token)input.LT(1);
+            match(input,NOT,FOLLOW_NOT_in_lhs_not2423); if (failed) return d;
             if ( backtracking==0 ) {
 
               			d = new NotDescr( ); 
-              			d.setLocation( offset(NOT39.getLine()), NOT39.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)NOT39).getStartIndex() );
+              			d.setLocation( offset(NOT40.getLine()), NOT40.getCharPositionInLine() );
+              			d.setStartCharacter( ((CommonToken)NOT40).getStartIndex() );
               			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION_NOT );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:869:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:886:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )
             int alt41=2;
             int LA41_0 = input.LA(1);
 
@@ -3571,29 +3640,29 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("869:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 41, 0, input);
+                    new NoViableAltException("886:3: ( ( LEFT_PAREN or= lhs_or RIGHT_PAREN ) | pattern= lhs_pattern )", 41, 0, input);
 
                 throw nvae;
             }
             switch (alt41) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:869:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:886:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:869:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:869:7: LEFT_PAREN or= lhs_or RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:886:5: ( LEFT_PAREN or= lhs_or RIGHT_PAREN )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:886:7: LEFT_PAREN or= lhs_or RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_not2377); if (failed) return d;
-                    pushFollow(FOLLOW_lhs_or_in_lhs_not2381);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_not2436); if (failed) return d;
+                    pushFollow(FOLLOW_lhs_or_in_lhs_not2440);
                     or=lhs_or();
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
                        if ( or != null ) d.addDescr( or ); 
                     }
-                    RIGHT_PAREN40=(Token)input.LT(1);
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_not2412); if (failed) return d;
+                    RIGHT_PAREN41=(Token)input.LT(1);
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_not2471); if (failed) return d;
                     if ( backtracking==0 ) {
-                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN40).getStopIndex() ); 
+                       d.setEndCharacter( ((CommonToken)RIGHT_PAREN41).getStopIndex() ); 
                     }
 
                     }
@@ -3602,9 +3671,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:875:3: pattern= lhs_pattern
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:892:3: pattern= lhs_pattern
                     {
-                    pushFollow(FOLLOW_lhs_pattern_in_lhs_not2449);
+                    pushFollow(FOLLOW_lhs_pattern_in_lhs_not2508);
                     pattern=lhs_pattern();
                     _fsp--;
                     if (failed) return d;
@@ -3638,11 +3707,11 @@
 
 
     // $ANTLR start lhs_eval
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:885:1: lhs_eval returns [BaseDescr d] : EVAL c= paren_chunk ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:902:1: lhs_eval returns [BaseDescr d] : EVAL c= paren_chunk ;
     public final BaseDescr lhs_eval() throws RecognitionException {
         BaseDescr d = null;
 
-        Token EVAL41=null;
+        Token EVAL42=null;
         paren_chunk_return c = null;
 
 
@@ -3650,27 +3719,27 @@
         		d = new EvalDescr( );
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:889:2: ( EVAL c= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:890:3: EVAL c= paren_chunk
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:906:2: ( EVAL c= paren_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:907:3: EVAL c= paren_chunk
             {
-            EVAL41=(Token)input.LT(1);
-            match(input,EVAL,FOLLOW_EVAL_in_lhs_eval2495); if (failed) return d;
+            EVAL42=(Token)input.LT(1);
+            match(input,EVAL,FOLLOW_EVAL_in_lhs_eval2554); if (failed) return d;
             if ( backtracking==0 ) {
 
               			location.setType( Location.LOCATION_LHS_INSIDE_EVAL );
               		
             }
-            pushFollow(FOLLOW_paren_chunk_in_lhs_eval2506);
+            pushFollow(FOLLOW_paren_chunk_in_lhs_eval2565);
             c=paren_chunk();
             _fsp--;
             if (failed) return d;
             if ( backtracking==0 ) {
                
-              			d.setStartCharacter( ((CommonToken)EVAL41).getStartIndex() );
+              			d.setStartCharacter( ((CommonToken)EVAL42).getStartIndex() );
               		        if( input.toString(c.start,c.stop) != null ) {
               	  		    this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
               		            String body = safeSubstring( input.toString(c.start,c.stop), 1, input.toString(c.start,c.stop).length()-1 );
-              			    checkTrailingSemicolon( body, offset(EVAL41.getLine()) );
+              			    checkTrailingSemicolon( body, offset(EVAL42.getLine()) );
               			    ((EvalDescr) d).setContent( body );
               			    location.setProperty(Location.LOCATION_EVAL_CONTENT, body);
               			}
@@ -3695,12 +3764,12 @@
 
 
     // $ANTLR start lhs_forall
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:910:1: lhs_forall returns [ForallDescr d] : FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:927:1: lhs_forall returns [ForallDescr d] : FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN ;
     public final ForallDescr lhs_forall() throws RecognitionException {
         ForallDescr d = null;
 
-        Token FORALL42=null;
-        Token RIGHT_PAREN43=null;
+        Token FORALL43=null;
+        Token RIGHT_PAREN44=null;
         BaseDescr base = null;
 
         BaseDescr pattern = null;
@@ -3710,25 +3779,25 @@
         		d = factory.createForall();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:914:2: ( FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:914:4: FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:931:2: ( FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:931:4: FORALL LEFT_PAREN base= lhs_pattern (pattern= lhs_pattern )* RIGHT_PAREN
             {
-            FORALL42=(Token)input.LT(1);
-            match(input,FORALL,FOLLOW_FORALL_in_lhs_forall2532); if (failed) return d;
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_forall2534); if (failed) return d;
-            pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2538);
+            FORALL43=(Token)input.LT(1);
+            match(input,FORALL,FOLLOW_FORALL_in_lhs_forall2591); if (failed) return d;
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_lhs_forall2593); if (failed) return d;
+            pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2597);
             base=lhs_pattern();
             _fsp--;
             if (failed) return d;
             if ( backtracking==0 ) {
 
-              			d.setStartCharacter( ((CommonToken)FORALL42).getStartIndex() );
+              			d.setStartCharacter( ((CommonToken)FORALL43).getStartIndex() );
               		        // adding the base pattern
               		        d.addDescr( base );
-              			d.setLocation( offset(FORALL42.getLine()), FORALL42.getCharPositionInLine() );
+              			d.setLocation( offset(FORALL43.getLine()), FORALL43.getCharPositionInLine() );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:921:3: (pattern= lhs_pattern )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:938:3: (pattern= lhs_pattern )*
             loop42:
             do {
                 int alt42=2;
@@ -3741,9 +3810,9 @@
 
                 switch (alt42) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:921:5: pattern= lhs_pattern
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:938:5: pattern= lhs_pattern
             	    {
-            	    pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2553);
+            	    pushFollow(FOLLOW_lhs_pattern_in_lhs_forall2612);
             	    pattern=lhs_pattern();
             	    _fsp--;
             	    if (failed) return d;
@@ -3762,11 +3831,11 @@
                 }
             } while (true);
 
-            RIGHT_PAREN43=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_forall2569); if (failed) return d;
+            RIGHT_PAREN44=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_lhs_forall2628); if (failed) return d;
             if ( backtracking==0 ) {
 
-              		        d.setEndCharacter( ((CommonToken)RIGHT_PAREN43).getStopIndex() );
+              		        d.setEndCharacter( ((CommonToken)RIGHT_PAREN44).getStopIndex() );
               		
             }
 
@@ -3785,7 +3854,7 @@
 
 
     // $ANTLR start lhs_pattern
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:933:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:950:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );
     public final BaseDescr lhs_pattern() throws RecognitionException {
         BaseDescr d = null;
 
@@ -3796,14 +3865,14 @@
         		d =null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:940:2: (f= fact_binding | f= fact[null] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:957:2: (f= fact_binding | f= fact[null] )
             int alt43=2;
             int LA43_0 = input.LA(1);
 
             if ( (LA43_0==ID) ) {
                 int LA43_1 = input.LA(2);
 
-                if ( (LA43_1==74) ) {
+                if ( (LA43_1==76) ) {
                     alt43=1;
                 }
                 else if ( (LA43_1==DOT||LA43_1==LEFT_PAREN||LA43_1==LEFT_SQUARE) ) {
@@ -3812,7 +3881,7 @@
                 else {
                     if (backtracking>0) {failed=true; return d;}
                     NoViableAltException nvae =
-                        new NoViableAltException("933:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 43, 1, input);
+                        new NoViableAltException("950:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 43, 1, input);
 
                     throw nvae;
                 }
@@ -3820,15 +3889,15 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("933:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 43, 0, input);
+                    new NoViableAltException("950:1: lhs_pattern returns [BaseDescr d] : (f= fact_binding | f= fact[null] );", 43, 0, input);
 
                 throw nvae;
             }
             switch (alt43) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:940:4: f= fact_binding
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:957:4: f= fact_binding
                     {
-                    pushFollow(FOLLOW_fact_binding_in_lhs_pattern2602);
+                    pushFollow(FOLLOW_fact_binding_in_lhs_pattern2661);
                     f=fact_binding();
                     _fsp--;
                     if (failed) return d;
@@ -3836,9 +3905,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:941:4: f= fact[null]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:958:4: f= fact[null]
                     {
-                    pushFollow(FOLLOW_fact_in_lhs_pattern2610);
+                    pushFollow(FOLLOW_fact_in_lhs_pattern2669);
                     f=fact(null);
                     _fsp--;
                     if (failed) return d;
@@ -3865,7 +3934,7 @@
 
 
     // $ANTLR start from_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:944:1: from_statement returns [FromDescr d] : ds= from_source[$d] ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:961:1: from_statement returns [FromDescr d] : ds= from_source[$d] ;
     public final FromDescr from_statement() throws RecognitionException {
         FromDescr d = null;
 
@@ -3876,10 +3945,10 @@
         		d =factory.createFrom();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:948:2: (ds= from_source[$d] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:949:2: ds= from_source[$d]
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:965:2: (ds= from_source[$d] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:966:2: ds= from_source[$d]
             {
-            pushFollow(FOLLOW_from_source_in_from_statement2637);
+            pushFollow(FOLLOW_from_source_in_from_statement2696);
             ds=from_source(d);
             _fsp--;
             if (failed) return d;
@@ -3904,13 +3973,13 @@
 
 
     // $ANTLR start accumulate_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:956:1: accumulate_statement returns [AccumulateDescr d] : ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:973:1: accumulate_statement returns [AccumulateDescr d] : ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN ;
     public final AccumulateDescr accumulate_statement() throws RecognitionException {
         AccumulateDescr d = null;
 
         Token id=null;
-        Token ACCUMULATE44=null;
-        Token RIGHT_PAREN45=null;
+        Token ACCUMULATE45=null;
+        Token RIGHT_PAREN46=null;
         BaseDescr inputCE = null;
 
         paren_chunk_return text = null;
@@ -3920,24 +3989,24 @@
         		d = factory.createAccumulate();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:960:2: ( ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:961:10: ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:977:2: ( ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:978:10: ACCUMULATE LEFT_PAREN inputCE= lhs_or ( COMMA )? ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) ) RIGHT_PAREN
             {
-            ACCUMULATE44=(Token)input.LT(1);
-            match(input,ACCUMULATE,FOLLOW_ACCUMULATE_in_accumulate_statement2674); if (failed) return d;
+            ACCUMULATE45=(Token)input.LT(1);
+            match(input,ACCUMULATE,FOLLOW_ACCUMULATE_in_accumulate_statement2733); if (failed) return d;
             if ( backtracking==0 ) {
                
-              			d.setLocation( offset(ACCUMULATE44.getLine()), ACCUMULATE44.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)ACCUMULATE44).getStartIndex() );
+              			d.setLocation( offset(ACCUMULATE45.getLine()), ACCUMULATE45.getCharPositionInLine() );
+              			d.setStartCharacter( ((CommonToken)ACCUMULATE45).getStartIndex() );
               			location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE );
               		
             }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_accumulate_statement2684); if (failed) return d;
-            pushFollow(FOLLOW_lhs_or_in_accumulate_statement2688);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_accumulate_statement2743); if (failed) return d;
+            pushFollow(FOLLOW_lhs_or_in_accumulate_statement2747);
             inputCE=lhs_or();
             _fsp--;
             if (failed) return d;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:967:29: ( COMMA )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:984:29: ( COMMA )?
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -3946,9 +4015,9 @@
             }
             switch (alt44) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:967:29: COMMA
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:984:29: COMMA
                     {
-                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2690); if (failed) return d;
+                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2749); if (failed) return d;
 
                     }
                     break;
@@ -3960,7 +4029,7 @@
               		        d.setInput( inputCE );
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:971:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:988:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )
             int alt49=2;
             int LA49_0 = input.LA(1);
 
@@ -3973,28 +4042,28 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("971:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )", 49, 0, input);
+                    new NoViableAltException("988:3: ( ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk ) | (id= ID text= paren_chunk ) )", 49, 0, input);
 
                 throw nvae;
             }
             switch (alt49) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:971:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:988:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:971:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:972:4: INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:988:5: ( INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:989:4: INIT text= paren_chunk ( COMMA )? ACTION text= paren_chunk ( COMMA )? ( REVERSE text= paren_chunk ( COMMA )? )? RESULT text= paren_chunk
                     {
-                    match(input,INIT,FOLLOW_INIT_in_accumulate_statement2708); if (failed) return d;
+                    match(input,INIT,FOLLOW_INIT_in_accumulate_statement2767); if (failed) return d;
                     if ( backtracking==0 ) {
 
                       				location.setType( Location.LOCATION_LHS_FROM_ACCUMULATE_INIT );
                       			
                     }
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2721);
+                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2780);
                     text=paren_chunk();
                     _fsp--;
                     if (failed) return d;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:976:21: ( COMMA )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:21: ( COMMA )?
                     int alt45=2;
                     int LA45_0 = input.LA(1);
 
@@ -4003,9 +4072,9 @@
                     }
                     switch (alt45) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:976:21: COMMA
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:993:21: COMMA
                             {
-                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2723); if (failed) return d;
+                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2782); if (failed) return d;
 
                             }
                             break;
@@ -4021,12 +4090,12 @@
                       				}
                       			
                     }
-                    match(input,ACTION,FOLLOW_ACTION_in_accumulate_statement2734); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2738);
+                    match(input,ACTION,FOLLOW_ACTION_in_accumulate_statement2793); if (failed) return d;
+                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2797);
                     text=paren_chunk();
                     _fsp--;
                     if (failed) return d;
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:984:28: ( COMMA )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1001:28: ( COMMA )?
                     int alt46=2;
                     int LA46_0 = input.LA(1);
 
@@ -4035,9 +4104,9 @@
                     }
                     switch (alt46) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:984:28: COMMA
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1001:28: COMMA
                             {
-                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2740); if (failed) return d;
+                            match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2799); if (failed) return d;
 
                             }
                             break;
@@ -4053,7 +4122,7 @@
                       				}
                       			
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:992:4: ( REVERSE text= paren_chunk ( COMMA )? )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1009:4: ( REVERSE text= paren_chunk ( COMMA )? )?
                     int alt48=2;
                     int LA48_0 = input.LA(1);
 
@@ -4062,14 +4131,14 @@
                     }
                     switch (alt48) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:992:6: REVERSE text= paren_chunk ( COMMA )?
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1009:6: REVERSE text= paren_chunk ( COMMA )?
                             {
-                            match(input,REVERSE,FOLLOW_REVERSE_in_accumulate_statement2753); if (failed) return d;
-                            pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2757);
+                            match(input,REVERSE,FOLLOW_REVERSE_in_accumulate_statement2812); if (failed) return d;
+                            pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2816);
                             text=paren_chunk();
                             _fsp--;
                             if (failed) return d;
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:992:31: ( COMMA )?
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1009:31: ( COMMA )?
                             int alt47=2;
                             int LA47_0 = input.LA(1);
 
@@ -4078,9 +4147,9 @@
                             }
                             switch (alt47) {
                                 case 1 :
-                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:992:31: COMMA
+                                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1009:31: COMMA
                                     {
-                                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2759); if (failed) return d;
+                                    match(input,COMMA,FOLLOW_COMMA_in_accumulate_statement2818); if (failed) return d;
 
                                     }
                                     break;
@@ -4102,8 +4171,8 @@
 
                     }
 
-                    match(input,RESULT,FOLLOW_RESULT_in_accumulate_statement2776); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2780);
+                    match(input,RESULT,FOLLOW_RESULT_in_accumulate_statement2835); if (failed) return d;
+                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2839);
                     text=paren_chunk();
                     _fsp--;
                     if (failed) return d;
@@ -4122,14 +4191,14 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:3: (id= ID text= paren_chunk )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1027:3: (id= ID text= paren_chunk )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1010:3: (id= ID text= paren_chunk )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1011:4: id= ID text= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1027:3: (id= ID text= paren_chunk )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1028:4: id= ID text= paren_chunk
                     {
                     id=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_accumulate_statement2806); if (failed) return d;
-                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2810);
+                    match(input,ID,FOLLOW_ID_in_accumulate_statement2865); if (failed) return d;
+                    pushFollow(FOLLOW_paren_chunk_in_accumulate_statement2869);
                     text=paren_chunk();
                     _fsp--;
                     if (failed) return d;
@@ -4154,12 +4223,12 @@
 
             }
 
-            RIGHT_PAREN45=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_accumulate_statement2827); if (failed) return d;
+            RIGHT_PAREN46=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_accumulate_statement2886); if (failed) return d;
             if ( backtracking==0 ) {
 
               			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN45).getStopIndex() );
+              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN46).getStopIndex() );
               		
             }
 
@@ -4178,7 +4247,7 @@
 
 
     // $ANTLR start from_source
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1029:4: from_source[FromDescr from] returns [DeclarativeInvokerDescr ds] : ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1046:4: from_source[FromDescr from] returns [DeclarativeInvokerDescr ds] : ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? ;
     public final DeclarativeInvokerDescr from_source(FromDescr from) throws RecognitionException {
         DeclarativeInvokerDescr ds = null;
 
@@ -4193,10 +4262,10 @@
         		FunctionCallDescr fc = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1035:2: (ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1035:4: ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1052:2: (ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1052:4: ident= identifier ( options {k=1; } : args= paren_chunk )? ( expression_chain[$from, ad] )?
             {
-            pushFollow(FOLLOW_identifier_in_from_source2855);
+            pushFollow(FOLLOW_identifier_in_from_source2914);
             ident=identifier();
             _fsp--;
             if (failed) return ds;
@@ -4210,7 +4279,7 @@
               			location.setProperty(Location.LOCATION_FROM_CONTENT, ident.start.getText());
               		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1044:3: ( options {k=1; } : args= paren_chunk )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1061:3: ( options {k=1; } : args= paren_chunk )?
             int alt50=2;
             int LA50_0 = input.LA(1);
 
@@ -4219,9 +4288,9 @@
             }
             switch (alt50) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1051:5: args= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1068:5: args= paren_chunk
                     {
-                    pushFollow(FOLLOW_paren_chunk_in_from_source2883);
+                    pushFollow(FOLLOW_paren_chunk_in_from_source2942);
                     args=paren_chunk();
                     _fsp--;
                     if (failed) return ds;
@@ -4245,7 +4314,7 @@
 
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1065:3: ( expression_chain[$from, ad] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1082:3: ( expression_chain[$from, ad] )?
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -4254,9 +4323,9 @@
             }
             switch (alt51) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1065:3: expression_chain[$from, ad]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1082:3: expression_chain[$from, ad]
                     {
-                    pushFollow(FOLLOW_expression_chain_in_from_source2896);
+                    pushFollow(FOLLOW_expression_chain_in_from_source2955);
                     expression_chain(from,  ad);
                     _fsp--;
                     if (failed) return ds;
@@ -4290,7 +4359,7 @@
 
 
     // $ANTLR start expression_chain
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1079:1: expression_chain[FromDescr from, AccessorDescr as] : ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1096:1: expression_chain[FromDescr from, AccessorDescr as] : ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) ;
     public final void expression_chain(FromDescr from, AccessorDescr as) throws RecognitionException {
         identifier_return field = null;
 
@@ -4304,14 +4373,14 @@
         	    	MethodAccessDescr ma = null;	
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1084:2: ( ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1085:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1101:2: ( ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1102:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1085:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1085:4: DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1102:2: ( DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1102:4: DOT field= identifier ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )? ( expression_chain[from, as] )?
             {
-            match(input,DOT,FOLLOW_DOT_in_expression_chain2931); if (failed) return ;
-            pushFollow(FOLLOW_identifier_in_expression_chain2935);
+            match(input,DOT,FOLLOW_DOT_in_expression_chain2990); if (failed) return ;
+            pushFollow(FOLLOW_identifier_in_expression_chain2994);
             field=identifier();
             _fsp--;
             if (failed) return ;
@@ -4323,14 +4392,14 @@
               		fa.setEndCharacter( ((CommonToken)((Token)field.start)).getStopIndex() );
               	    
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1092:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1109:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?
             int alt52=3;
             alt52 = dfa52.predict(input);
             switch (alt52) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1093:6: ( LEFT_SQUARE )=>sqarg= square_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:6: ( LEFT_SQUARE )=>sqarg= square_chunk
                     {
-                    pushFollow(FOLLOW_square_chunk_in_expression_chain2966);
+                    pushFollow(FOLLOW_square_chunk_in_expression_chain3025);
                     sqarg=square_chunk();
                     _fsp--;
                     if (failed) return ;
@@ -4344,9 +4413,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1099:6: ( LEFT_PAREN )=>paarg= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1116:6: ( LEFT_PAREN )=>paarg= paren_chunk
                     {
-                    pushFollow(FOLLOW_paren_chunk_in_expression_chain2999);
+                    pushFollow(FOLLOW_paren_chunk_in_expression_chain3058);
                     paarg=paren_chunk();
                     _fsp--;
                     if (failed) return ;
@@ -4364,7 +4433,7 @@
 
             }
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1107:4: ( expression_chain[from, as] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1124:4: ( expression_chain[from, as] )?
             int alt53=2;
             int LA53_0 = input.LA(1);
 
@@ -4373,9 +4442,9 @@
             }
             switch (alt53) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1107:4: expression_chain[from, as]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1124:4: expression_chain[from, as]
                     {
-                    pushFollow(FOLLOW_expression_chain_in_expression_chain3014);
+                    pushFollow(FOLLOW_expression_chain_in_expression_chain3073);
                     expression_chain(from,  as);
                     _fsp--;
                     if (failed) return ;
@@ -4412,12 +4481,12 @@
 
 
     // $ANTLR start collect_statement
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1121:1: collect_statement returns [CollectDescr d] : COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1138:1: collect_statement returns [CollectDescr d] : COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN ;
     public final CollectDescr collect_statement() throws RecognitionException {
         CollectDescr d = null;
 
-        Token COLLECT46=null;
-        Token RIGHT_PAREN47=null;
+        Token COLLECT47=null;
+        Token RIGHT_PAREN48=null;
         BaseDescr pattern = null;
 
 
@@ -4425,29 +4494,29 @@
         		d = factory.createCollect();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1125:2: ( COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1126:10: COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1142:2: ( COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1143:10: COLLECT LEFT_PAREN pattern= pattern_source RIGHT_PAREN
             {
-            COLLECT46=(Token)input.LT(1);
-            match(input,COLLECT,FOLLOW_COLLECT_in_collect_statement3065); if (failed) return d;
+            COLLECT47=(Token)input.LT(1);
+            match(input,COLLECT,FOLLOW_COLLECT_in_collect_statement3124); if (failed) return d;
             if ( backtracking==0 ) {
                
-              			d.setLocation( offset(COLLECT46.getLine()), COLLECT46.getCharPositionInLine() );
-              			d.setStartCharacter( ((CommonToken)COLLECT46).getStartIndex() );
+              			d.setLocation( offset(COLLECT47.getLine()), COLLECT47.getCharPositionInLine() );
+              			d.setStartCharacter( ((CommonToken)COLLECT47).getStartIndex() );
               			location.setType( Location.LOCATION_LHS_FROM_COLLECT );
               		
             }
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_collect_statement3075); if (failed) return d;
-            pushFollow(FOLLOW_pattern_source_in_collect_statement3079);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_collect_statement3134); if (failed) return d;
+            pushFollow(FOLLOW_pattern_source_in_collect_statement3138);
             pattern=pattern_source();
             _fsp--;
             if (failed) return d;
-            RIGHT_PAREN47=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_collect_statement3081); if (failed) return d;
+            RIGHT_PAREN48=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_collect_statement3140); if (failed) return d;
             if ( backtracking==0 ) {
 
               		        d.setInputPattern( (PatternDescr) pattern );
-              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN47).getStopIndex() );
+              			d.setEndCharacter( ((CommonToken)RIGHT_PAREN48).getStopIndex() );
               			location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
               		
             }
@@ -4467,11 +4536,11 @@
 
 
     // $ANTLR start fact_binding
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1140:1: fact_binding returns [BaseDescr d] : ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1157:1: fact_binding returns [BaseDescr d] : ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) ;
     public final BaseDescr fact_binding() throws RecognitionException {
         BaseDescr d = null;
 
-        Token ID48=null;
+        Token ID49=null;
         BaseDescr fe = null;
 
         BaseDescr left = null;
@@ -4484,20 +4553,20 @@
         		OrDescr or = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1145:3: ( ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1146:4: ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1162:3: ( ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1163:4: ID ':' (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
             {
-            ID48=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_fact_binding3113); if (failed) return d;
-            match(input,74,FOLLOW_74_in_fact_binding3115); if (failed) return d;
+            ID49=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_fact_binding3172); if (failed) return d;
+            match(input,76,FOLLOW_76_in_fact_binding3174); if (failed) return d;
             if ( backtracking==0 ) {
 
                		        // handling incomplete parsing
                		        d = new PatternDescr( );
-               		        ((PatternDescr) d).setIdentifier( ID48.getText() );
+               		        ((PatternDescr) d).setIdentifier( ID49.getText() );
                		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1152:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1169:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -4510,16 +4579,16 @@
             else {
                 if (backtracking>0) {failed=true; return d;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1152:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )", 55, 0, input);
+                    new NoViableAltException("1169:3: (fe= fact[$ID.text] | LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN )", 55, 0, input);
 
                 throw nvae;
             }
             switch (alt55) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1152:5: fe= fact[$ID.text]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1169:5: fe= fact[$ID.text]
                     {
-                    pushFollow(FOLLOW_fact_in_fact_binding3129);
-                    fe=fact(ID48.getText());
+                    pushFollow(FOLLOW_fact_in_fact_binding3188);
+                    fe=fact(ID49.getText());
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
@@ -4527,7 +4596,7 @@
                        		        // override previously instantiated pattern
                        			d =fe;
                        			if( d != null ) {
-                         			    d.setStartCharacter( ((CommonToken)ID48).getStartIndex() );
+                         			    d.setStartCharacter( ((CommonToken)ID49).getStartIndex() );
                          			}
                        		
                     }
@@ -4535,11 +4604,11 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1161:4: LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1178:4: LEFT_PAREN left= fact[$ID.text] ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )* RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact_binding3145); if (failed) return d;
-                    pushFollow(FOLLOW_fact_in_fact_binding3149);
-                    left=fact(ID48.getText());
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact_binding3204); if (failed) return d;
+                    pushFollow(FOLLOW_fact_in_fact_binding3208);
+                    left=fact(ID49.getText());
                     _fsp--;
                     if (failed) return d;
                     if ( backtracking==0 ) {
@@ -4547,11 +4616,11 @@
                        		        // override previously instantiated pattern
                        			d =left;
                        			if( d != null ) {
-                         			    d.setStartCharacter( ((CommonToken)ID48).getStartIndex() );
+                         			    d.setStartCharacter( ((CommonToken)ID49).getStartIndex() );
                          			}
                        		
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1169:4: ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )*
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1186:4: ( ( OR | DOUBLE_PIPE ) right= fact[$ID.text] )*
                     loop54:
                     do {
                         int alt54=2;
@@ -4564,7 +4633,7 @@
 
                         switch (alt54) {
                     	case 1 :
-                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1169:6: ( OR | DOUBLE_PIPE ) right= fact[$ID.text]
+                    	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1186:6: ( OR | DOUBLE_PIPE ) right= fact[$ID.text]
                     	    {
                     	    if ( (input.LA(1)>=OR && input.LA(1)<=DOUBLE_PIPE) ) {
                     	        input.consume();
@@ -4574,11 +4643,11 @@
                     	        if (backtracking>0) {failed=true; return d;}
                     	        MismatchedSetException mse =
                     	            new MismatchedSetException(null,input);
-                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_fact_binding3162);    throw mse;
+                    	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_fact_binding3221);    throw mse;
                     	    }
 
-                    	    pushFollow(FOLLOW_fact_in_fact_binding3174);
-                    	    right=fact(ID48.getText());
+                    	    pushFollow(FOLLOW_fact_in_fact_binding3233);
+                    	    right=fact(ID49.getText());
                     	    _fsp--;
                     	    if (failed) return d;
                     	    if ( backtracking==0 ) {
@@ -4600,7 +4669,7 @@
                         }
                     } while (true);
 
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact_binding3192); if (failed) return d;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact_binding3251); if (failed) return d;
 
                     }
                     break;
@@ -4623,12 +4692,12 @@
 
 
     // $ANTLR start fact
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1184:1: fact[String ident] returns [BaseDescr d] : id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1201:1: fact[String ident] returns [BaseDescr d] : id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? ;
     public final BaseDescr fact(String ident) throws RecognitionException {
         BaseDescr d = null;
 
-        Token LEFT_PAREN49=null;
-        Token RIGHT_PAREN50=null;
+        Token LEFT_PAREN50=null;
+        Token RIGHT_PAREN51=null;
         qualified_id_return id = null;
 
 
@@ -4637,8 +4706,8 @@
         		PatternDescr pattern = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1189:3: (id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1190:11: id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1206:3: (id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )? )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1207:11: id= qualified_id LEFT_PAREN ( constraints[pattern] )? RIGHT_PAREN ( EOF )?
             {
             if ( backtracking==0 ) {
 
@@ -4649,7 +4718,7 @@
                			d = pattern; 
                	        
             }
-            pushFollow(FOLLOW_qualified_id_in_fact3247);
+            pushFollow(FOLLOW_qualified_id_in_fact3306);
             id=qualified_id();
             _fsp--;
             if (failed) return d;
@@ -4662,29 +4731,29 @@
                			}
                		
             }
-            LEFT_PAREN49=(Token)input.LT(1);
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact3257); if (failed) return d;
+            LEFT_PAREN50=(Token)input.LT(1);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_fact3316); if (failed) return d;
             if ( backtracking==0 ) {
 
               		        location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START );
                           		location.setProperty( Location.LOCATION_PROPERTY_CLASS_NAME, id.text );
                				
-               			pattern.setLocation( offset(LEFT_PAREN49.getLine()), LEFT_PAREN49.getCharPositionInLine() );
-               			pattern.setLeftParentCharacter( ((CommonToken)LEFT_PAREN49).getStartIndex() );
+               			pattern.setLocation( offset(LEFT_PAREN50.getLine()), LEFT_PAREN50.getCharPositionInLine() );
+               			pattern.setLeftParentCharacter( ((CommonToken)LEFT_PAREN50).getStartIndex() );
                		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1213:4: ( constraints[pattern] )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1230:4: ( constraints[pattern] )?
             int alt56=2;
             int LA56_0 = input.LA(1);
 
-            if ( ((LA56_0>=PACKAGE && LA56_0<=ID)||(LA56_0>=GLOBAL && LA56_0<=LEFT_PAREN)||(LA56_0>=QUERY && LA56_0<=ATTRIBUTES)||LA56_0==ENABLED||LA56_0==SALIENCE||(LA56_0>=DURATION && LA56_0<=DIALECT)||LA56_0==FROM||LA56_0==EVAL||(LA56_0>=INIT && LA56_0<=RESULT)||(LA56_0>=CONTAINS && LA56_0<=IN)||LA56_0==THEN) ) {
+            if ( ((LA56_0>=PACKAGE && LA56_0<=ID)||(LA56_0>=GLOBAL && LA56_0<=LEFT_PAREN)||(LA56_0>=QUERY && LA56_0<=ATTRIBUTES)||LA56_0==ENABLED||LA56_0==SALIENCE||(LA56_0>=DURATION && LA56_0<=DIALECT)||LA56_0==FROM||LA56_0==EVAL||(LA56_0>=INIT && LA56_0<=RESULT)||(LA56_0>=CONTAINS && LA56_0<=MEMBEROF)||LA56_0==IN||LA56_0==THEN) ) {
                 alt56=1;
             }
             switch (alt56) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1213:4: constraints[pattern]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1230:4: constraints[pattern]
                     {
-                    pushFollow(FOLLOW_constraints_in_fact3269);
+                    pushFollow(FOLLOW_constraints_in_fact3328);
                     constraints(pattern);
                     _fsp--;
                     if (failed) return d;
@@ -4694,19 +4763,19 @@
 
             }
 
-            RIGHT_PAREN50=(Token)input.LT(1);
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact3276); if (failed) return d;
+            RIGHT_PAREN51=(Token)input.LT(1);
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_fact3335); if (failed) return d;
             if ( backtracking==0 ) {
 
-              		        if( ")".equals( RIGHT_PAREN50.getText() ) ) {
+              		        if( ")".equals( RIGHT_PAREN51.getText() ) ) {
               				this.location.setType( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
-              				pattern.setEndLocation( offset(RIGHT_PAREN50.getLine()), RIGHT_PAREN50.getCharPositionInLine() );	
-              				pattern.setEndCharacter( ((CommonToken)RIGHT_PAREN50).getStopIndex() );
-              		        	pattern.setRightParentCharacter( ((CommonToken)RIGHT_PAREN50).getStartIndex() );
+              				pattern.setEndLocation( offset(RIGHT_PAREN51.getLine()), RIGHT_PAREN51.getCharPositionInLine() );	
+              				pattern.setEndCharacter( ((CommonToken)RIGHT_PAREN51).getStopIndex() );
+              		        	pattern.setRightParentCharacter( ((CommonToken)RIGHT_PAREN51).getStartIndex() );
               		        }
                		
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1223:4: ( EOF )?
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1240:4: ( EOF )?
             int alt57=2;
             int LA57_0 = input.LA(1);
 
@@ -4715,9 +4784,9 @@
             }
             switch (alt57) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1223:4: EOF
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1240:4: EOF
                     {
-                    match(input,EOF,FOLLOW_EOF_in_fact3285); if (failed) return d;
+                    match(input,EOF,FOLLOW_EOF_in_fact3344); if (failed) return d;
 
                     }
                     break;
@@ -4740,17 +4809,17 @@
 
 
     // $ANTLR start constraints
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1227:1: constraints[PatternDescr pattern] : constraint[$pattern] ( COMMA constraint[$pattern] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1244:1: constraints[PatternDescr pattern] : constraint[$pattern] ( COMMA constraint[$pattern] )* ;
     public final void constraints(PatternDescr pattern) throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1228:2: ( constraint[$pattern] ( COMMA constraint[$pattern] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1228:4: constraint[$pattern] ( COMMA constraint[$pattern] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1245:2: ( constraint[$pattern] ( COMMA constraint[$pattern] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1245:4: constraint[$pattern] ( COMMA constraint[$pattern] )*
             {
-            pushFollow(FOLLOW_constraint_in_constraints3303);
+            pushFollow(FOLLOW_constraint_in_constraints3362);
             constraint(pattern);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1229:3: ( COMMA constraint[$pattern] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1246:3: ( COMMA constraint[$pattern] )*
             loop58:
             do {
                 int alt58=2;
@@ -4763,13 +4832,13 @@
 
                 switch (alt58) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1229:5: COMMA constraint[$pattern]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1246:5: COMMA constraint[$pattern]
             	    {
-            	    match(input,COMMA,FOLLOW_COMMA_in_constraints3310); if (failed) return ;
+            	    match(input,COMMA,FOLLOW_COMMA_in_constraints3369); if (failed) return ;
             	    if ( backtracking==0 ) {
             	       location.setType( Location.LOCATION_LHS_INSIDE_CONDITION_START ); 
             	    }
-            	    pushFollow(FOLLOW_constraint_in_constraints3319);
+            	    pushFollow(FOLLOW_constraint_in_constraints3378);
             	    constraint(pattern);
             	    _fsp--;
             	    if (failed) return ;
@@ -4798,7 +4867,7 @@
 
 
     // $ANTLR start constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1234:1: constraint[PatternDescr pattern] : or_constr[top] ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1251:1: constraint[PatternDescr pattern] : or_constr[top] ;
     public final void constraint(PatternDescr pattern) throws RecognitionException {
 
         		ConditionalElementDescr top = null;
@@ -4806,15 +4875,15 @@
         		location.setProperty(Location.LOCATION_PROPERTY_PROPERTY_NAME, input.LT(1).getText() );
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1240:2: ( or_constr[top] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1241:3: or_constr[top]
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1257:2: ( or_constr[top] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1258:3: or_constr[top]
             {
             if ( backtracking==0 ) {
 
               			top = pattern.getConstraint();
               		
             }
-            pushFollow(FOLLOW_or_constr_in_constraint3352);
+            pushFollow(FOLLOW_or_constr_in_constraint3411);
             or_constr(top);
             _fsp--;
             if (failed) return ;
@@ -4834,20 +4903,20 @@
 
 
     // $ANTLR start or_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1247:1: or_constr[ConditionalElementDescr base] : and_constr[or] ( DOUBLE_PIPE and_constr[or] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1264:1: or_constr[ConditionalElementDescr base] : and_constr[or] ( DOUBLE_PIPE and_constr[or] )* ;
     public final void or_constr(ConditionalElementDescr base) throws RecognitionException {
 
         		OrDescr or = new OrDescr();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1251:2: ( and_constr[or] ( DOUBLE_PIPE and_constr[or] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1252:3: and_constr[or] ( DOUBLE_PIPE and_constr[or] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1268:2: ( and_constr[or] ( DOUBLE_PIPE and_constr[or] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1269:3: and_constr[or] ( DOUBLE_PIPE and_constr[or] )*
             {
-            pushFollow(FOLLOW_and_constr_in_or_constr3375);
+            pushFollow(FOLLOW_and_constr_in_or_constr3434);
             and_constr(or);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1253:3: ( DOUBLE_PIPE and_constr[or] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1270:3: ( DOUBLE_PIPE and_constr[or] )*
             loop59:
             do {
                 int alt59=2;
@@ -4860,15 +4929,15 @@
 
                 switch (alt59) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1253:5: DOUBLE_PIPE and_constr[or]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1270:5: DOUBLE_PIPE and_constr[or]
             	    {
-            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_constr3383); if (failed) return ;
+            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_constr3442); if (failed) return ;
             	    if ( backtracking==0 ) {
 
             	      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
             	      		
             	    }
-            	    pushFollow(FOLLOW_and_constr_in_or_constr3392);
+            	    pushFollow(FOLLOW_and_constr_in_or_constr3451);
             	    and_constr(or);
             	    _fsp--;
             	    if (failed) return ;
@@ -4906,20 +4975,20 @@
 
 
     // $ANTLR start and_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1268:1: and_constr[ConditionalElementDescr base] : unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1285:1: and_constr[ConditionalElementDescr base] : unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* ;
     public final void and_constr(ConditionalElementDescr base) throws RecognitionException {
 
         		AndDescr and = new AndDescr();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1272:2: ( unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1273:3: unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1289:2: ( unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1290:3: unary_constr[and] ( DOUBLE_AMPER unary_constr[and] )*
             {
-            pushFollow(FOLLOW_unary_constr_in_and_constr3424);
+            pushFollow(FOLLOW_unary_constr_in_and_constr3483);
             unary_constr(and);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1274:3: ( DOUBLE_AMPER unary_constr[and] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1291:3: ( DOUBLE_AMPER unary_constr[and] )*
             loop60:
             do {
                 int alt60=2;
@@ -4932,15 +5001,15 @@
 
                 switch (alt60) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1274:5: DOUBLE_AMPER unary_constr[and]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1291:5: DOUBLE_AMPER unary_constr[and]
             	    {
-            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_constr3432); if (failed) return ;
+            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_constr3491); if (failed) return ;
             	    if ( backtracking==0 ) {
 
             	      			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_START);
             	      		
             	    }
-            	    pushFollow(FOLLOW_unary_constr_in_and_constr3441);
+            	    pushFollow(FOLLOW_unary_constr_in_and_constr3500);
             	    unary_constr(and);
             	    _fsp--;
             	    if (failed) return ;
@@ -4978,18 +5047,19 @@
 
 
     // $ANTLR start unary_constr
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1289:1: unary_constr[ConditionalElementDescr base] : ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1306:1: unary_constr[ConditionalElementDescr base] : ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) ;
     public final void unary_constr(ConditionalElementDescr base) throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1290:2: ( ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1291:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1307:2: ( ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1308:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1291:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1308:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )
             int alt61=3;
             switch ( input.LA(1) ) {
             case PACKAGE:
             case IMPORT:
             case FUNCTION:
+            case EVENT:
             case ID:
             case GLOBAL:
             case QUERY:
@@ -5031,16 +5101,16 @@
             default:
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1291:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )", 61, 0, input);
+                    new NoViableAltException("1308:3: ( field_constraint[$base] | LEFT_PAREN or_constr[$base] RIGHT_PAREN | EVAL predicate[$base] )", 61, 0, input);
 
                 throw nvae;
             }
 
             switch (alt61) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1291:5: field_constraint[$base]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1308:5: field_constraint[$base]
                     {
-                    pushFollow(FOLLOW_field_constraint_in_unary_constr3469);
+                    pushFollow(FOLLOW_field_constraint_in_unary_constr3528);
                     field_constraint(base);
                     _fsp--;
                     if (failed) return ;
@@ -5048,22 +5118,22 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1292:5: LEFT_PAREN or_constr[$base] RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1309:5: LEFT_PAREN or_constr[$base] RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unary_constr3477); if (failed) return ;
-                    pushFollow(FOLLOW_or_constr_in_unary_constr3479);
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_unary_constr3536); if (failed) return ;
+                    pushFollow(FOLLOW_or_constr_in_unary_constr3538);
                     or_constr(base);
                     _fsp--;
                     if (failed) return ;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unary_constr3482); if (failed) return ;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_unary_constr3541); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1293:5: EVAL predicate[$base]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1310:5: EVAL predicate[$base]
                     {
-                    match(input,EVAL,FOLLOW_EVAL_in_unary_constr3488); if (failed) return ;
-                    pushFollow(FOLLOW_predicate_in_unary_constr3490);
+                    match(input,EVAL,FOLLOW_EVAL_in_unary_constr3547); if (failed) return ;
+                    pushFollow(FOLLOW_predicate_in_unary_constr3549);
                     predicate(base);
                     _fsp--;
                     if (failed) return ;
@@ -5089,9 +5159,9 @@
 
 
     // $ANTLR start field_constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1297:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? ) | (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) ) );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1314:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );
     public final void field_constraint(ConditionalElementDescr base) throws RecognitionException {
-        Token ID51=null;
+        Token ID52=null;
         accessor_path_return f = null;
 
 
@@ -5101,58 +5171,58 @@
         		RestrictionConnectiveDescr top = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1303:2: ( ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? ) | (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1320:2: ( ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) )
             int alt63=2;
             int LA63_0 = input.LA(1);
 
             if ( (LA63_0==ID) ) {
                 int LA63_1 = input.LA(2);
 
-                if ( (LA63_1==74) ) {
+                if ( (LA63_1==76) ) {
                     alt63=1;
                 }
-                else if ( (LA63_1==DOT||LA63_1==LEFT_PAREN||LA63_1==NOT||(LA63_1>=CONTAINS && LA63_1<=IN)||LA63_1==LEFT_SQUARE||(LA63_1>=76 && LA63_1<=81)) ) {
+                else if ( (LA63_1==DOT||LA63_1==LEFT_PAREN||LA63_1==NOT||(LA63_1>=CONTAINS && LA63_1<=IN)||LA63_1==LEFT_SQUARE||(LA63_1>=78 && LA63_1<=83)) ) {
                     alt63=2;
                 }
                 else {
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1297:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? ) | (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) ) );", 63, 1, input);
+                        new NoViableAltException("1314:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );", 63, 1, input);
 
                     throw nvae;
                 }
             }
-            else if ( ((LA63_0>=PACKAGE && LA63_0<=FUNCTION)||LA63_0==GLOBAL||(LA63_0>=QUERY && LA63_0<=ATTRIBUTES)||LA63_0==ENABLED||LA63_0==SALIENCE||(LA63_0>=DURATION && LA63_0<=DIALECT)||LA63_0==FROM||(LA63_0>=INIT && LA63_0<=RESULT)||(LA63_0>=CONTAINS && LA63_0<=IN)||LA63_0==THEN) ) {
+            else if ( ((LA63_0>=PACKAGE && LA63_0<=EVENT)||LA63_0==GLOBAL||(LA63_0>=QUERY && LA63_0<=ATTRIBUTES)||LA63_0==ENABLED||LA63_0==SALIENCE||(LA63_0>=DURATION && LA63_0<=DIALECT)||LA63_0==FROM||(LA63_0>=INIT && LA63_0<=RESULT)||(LA63_0>=CONTAINS && LA63_0<=MEMBEROF)||LA63_0==IN||LA63_0==THEN) ) {
                 alt63=2;
             }
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1297:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? ) | (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) ) );", 63, 0, input);
+                    new NoViableAltException("1314:1: field_constraint[ConditionalElementDescr base] : ( ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? ) | (f= accessor_path or_restr_connective[top] ) );", 63, 0, input);
 
                 throw nvae;
             }
             switch (alt63) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1304:10: ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1321:10: ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1304:10: ( ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )? )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1305:3: ID ':' f= accessor_path ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1321:10: ( ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )? )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1322:3: ID ':' f= accessor_path ( or_restr_connective[top] | '->' predicate[$base] )?
                     {
-                    ID51=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_field_constraint3529); if (failed) return ;
-                    match(input,74,FOLLOW_74_in_field_constraint3531); if (failed) return ;
+                    ID52=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_field_constraint3588); if (failed) return ;
+                    match(input,76,FOLLOW_76_in_field_constraint3590); if (failed) return ;
                     if ( backtracking==0 ) {
                        
                       			fbd = new FieldBindingDescr();
-                      			fbd.setIdentifier( ID51.getText() );
-                      			fbd.setLocation( offset(ID51.getLine()), ID51.getCharPositionInLine() );
-                      			fbd.setStartCharacter( ((CommonToken)ID51).getStartIndex() );
+                      			fbd.setIdentifier( ID52.getText() );
+                      			fbd.setLocation( offset(ID52.getLine()), ID52.getCharPositionInLine() );
+                      			fbd.setStartCharacter( ((CommonToken)ID52).getStartIndex() );
                       			base.addDescr( fbd );
 
                       		    
                     }
-                    pushFollow(FOLLOW_accessor_path_in_field_constraint3550);
+                    pushFollow(FOLLOW_accessor_path_in_field_constraint3609);
                     f=accessor_path();
                     _fsp--;
                     if (failed) return ;
@@ -5167,7 +5237,7 @@
                       			if ( fbd != null ) {
                       			    fbd.setFieldName( f.text );
                       			    // may have been overwritten
-                      			    fbd.setStartCharacter( ((CommonToken)ID51).getStartIndex() );
+                      			    fbd.setStartCharacter( ((CommonToken)ID52).getStartIndex() );
                       			} 
                       			fc = new FieldConstraintDescr(f.text);
                       			fc.setLocation( offset(((Token)f.start).getLine()), ((Token)f.start).getCharPositionInLine() );
@@ -5175,52 +5245,46 @@
                       			top = fc.getRestriction();
                       			
                       			// it must be a field constraint, as it is not a binding
-                      			if( ID51 == null ) {
+                      			if( ID52 == null ) {
                       			    base.addDescr( fc );
                       			}
                       		    }
                       		
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1339:3: ( ( options {backtrack=true; } : or_restr_connective[top] ) | '->' predicate[$base] )?
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1356:3: ( or_restr_connective[top] | '->' predicate[$base] )?
                     int alt62=3;
                     int LA62_0 = input.LA(1);
 
-                    if ( (LA62_0==LEFT_PAREN||LA62_0==NOT||(LA62_0>=CONTAINS && LA62_0<=IN)||(LA62_0>=76 && LA62_0<=81)) ) {
+                    if ( (LA62_0==LEFT_PAREN||LA62_0==NOT||(LA62_0>=CONTAINS && LA62_0<=IN)||(LA62_0>=78 && LA62_0<=83)) ) {
                         alt62=1;
                     }
-                    else if ( (LA62_0==75) ) {
+                    else if ( (LA62_0==77) ) {
                         alt62=2;
                     }
                     switch (alt62) {
                         case 1 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1340:4: ( options {backtrack=true; } : or_restr_connective[top] )
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1357:4: or_restr_connective[top]
                             {
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1340:4: ( options {backtrack=true; } : or_restr_connective[top] )
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1341:6: or_restr_connective[top]
-                            {
-                            pushFollow(FOLLOW_or_restr_connective_in_field_constraint3578);
+                            pushFollow(FOLLOW_or_restr_connective_in_field_constraint3623);
                             or_restr_connective(top);
                             _fsp--;
                             if (failed) return ;
                             if ( backtracking==0 ) {
 
                               				// we must add now as we didn't before
-                              				if( ID51 != null) {
+                              				if( ID52 != null) {
                               				    base.addDescr( fc );
                               				}
                               			
                             }
 
                             }
-
-
-                            }
                             break;
                         case 2 :
-                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1350:4: '->' predicate[$base]
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1365:4: '->' predicate[$base]
                             {
-                            match(input,75,FOLLOW_75_in_field_constraint3598); if (failed) return ;
-                            pushFollow(FOLLOW_predicate_in_field_constraint3600);
+                            match(input,77,FOLLOW_77_in_field_constraint3638); if (failed) return ;
+                            pushFollow(FOLLOW_predicate_in_field_constraint3640);
                             predicate(base);
                             _fsp--;
                             if (failed) return ;
@@ -5237,12 +5301,12 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1354:3: (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1369:3: (f= accessor_path or_restr_connective[top] )
                     {
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1354:3: (f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] ) )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1355:3: f= accessor_path ( options {backtrack=true; } : or_restr_connective[top] )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1369:3: (f= accessor_path or_restr_connective[top] )
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1370:3: f= accessor_path or_restr_connective[top]
                     {
-                    pushFollow(FOLLOW_accessor_path_in_field_constraint3626);
+                    pushFollow(FOLLOW_accessor_path_in_field_constraint3666);
                     f=accessor_path();
                     _fsp--;
                     if (failed) return ;
@@ -5263,10 +5327,7 @@
                       		    }
                       		
                     }
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1371:3: ( options {backtrack=true; } : or_restr_connective[top] )
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1372:5: or_restr_connective[top]
-                    {
-                    pushFollow(FOLLOW_or_restr_connective_in_field_constraint3648);
+                    pushFollow(FOLLOW_or_restr_connective_in_field_constraint3675);
                     or_restr_connective(top);
                     _fsp--;
                     if (failed) return ;
@@ -5275,9 +5336,6 @@
 
 
                     }
-
-
-                    }
                     break;
 
             }
@@ -5303,35 +5361,35 @@
 
 
     // $ANTLR start or_restr_connective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1389:1: or_restr_connective[ RestrictionConnectiveDescr base ] options {backtrack=true; } : and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1402:1: or_restr_connective[ RestrictionConnectiveDescr base ] options {backtrack=true; } : and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* ;
     public final void or_restr_connective(RestrictionConnectiveDescr base) throws RecognitionException {
 
         		RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1396:2: ( and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1397:3: and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1409:2: ( and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1410:3: and_restr_connective[or] ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
             {
-            pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3699);
+            pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3722);
             and_restr_connective(or);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1398:3: ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1411:3: ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*
             loop64:
             do {
                 int alt64=2;
                 alt64 = dfa64.predict(input);
                 switch (alt64) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1400:6: DOUBLE_PIPE and_restr_connective[or]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1413:6: DOUBLE_PIPE and_restr_connective[or]
             	    {
-            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_restr_connective3723); if (failed) return ;
+            	    match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_or_restr_connective3745); if (failed) return ;
             	    if ( backtracking==0 ) {
 
             	      				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
             	      			
             	    }
-            	    pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3734);
+            	    pushFollow(FOLLOW_and_restr_connective_in_or_restr_connective3756);
             	    and_restr_connective(or);
             	    _fsp--;
             	    if (failed) return ;
@@ -5367,7 +5425,7 @@
 
 
     // $ANTLR start and_restr_connective
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1415:1: and_restr_connective[ RestrictionConnectiveDescr base ] : constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1428:1: and_restr_connective[ RestrictionConnectiveDescr base ] : constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* ;
     public final void and_restr_connective(RestrictionConnectiveDescr base) throws RecognitionException {
         Token t=null;
 
@@ -5375,30 +5433,30 @@
         		RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1419:2: ( constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1420:3: constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1432:2: ( constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1433:3: constraint_expression[and] ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
             {
-            pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3766);
+            pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3788);
             constraint_expression(and);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1421:3: ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1434:3: ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*
             loop65:
             do {
                 int alt65=2;
                 alt65 = dfa65.predict(input);
                 switch (alt65) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1422:5: t= DOUBLE_AMPER constraint_expression[and]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1435:5: t= DOUBLE_AMPER constraint_expression[and]
             	    {
             	    t=(Token)input.LT(1);
-            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_restr_connective3787); if (failed) return ;
+            	    match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_and_restr_connective3808); if (failed) return ;
             	    if ( backtracking==0 ) {
 
             	      				location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
             	      			
             	    }
-            	    pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3798);
+            	    pushFollow(FOLLOW_constraint_expression_in_and_restr_connective3819);
             	    constraint_expression(and);
             	    _fsp--;
             	    if (failed) return ;
@@ -5434,13 +5492,13 @@
 
 
     // $ANTLR start constraint_expression
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1437:1: constraint_expression[RestrictionConnectiveDescr base] : ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1450:1: constraint_expression[RestrictionConnectiveDescr base] : ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) ;
     public final void constraint_expression(RestrictionConnectiveDescr base) throws RecognitionException {
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1438:9: ( ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1439:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1451:9: ( ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1452:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1439:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1452:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )
             int alt66=3;
             switch ( input.LA(1) ) {
             case IN:
@@ -5452,7 +5510,7 @@
                 {
                 int LA66_2 = input.LA(2);
 
-                if ( (LA66_2==CONTAINS||LA66_2==MATCHES||LA66_2==MEMBEROF) ) {
+                if ( (LA66_2==CONTAINS||LA66_2==MATCHES||(LA66_2>=MEMBEROF && LA66_2<=TILDE)) ) {
                     alt66=2;
                 }
                 else if ( (LA66_2==IN) ) {
@@ -5461,7 +5519,7 @@
                 else {
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1439:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 66, 2, input);
+                        new NoViableAltException("1452:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 66, 2, input);
 
                     throw nvae;
                 }
@@ -5472,12 +5530,13 @@
             case MATCHES:
             case SOUNDSLIKE:
             case MEMBEROF:
-            case 76:
-            case 77:
+            case TILDE:
             case 78:
             case 79:
             case 80:
             case 81:
+            case 82:
+            case 83:
                 {
                 alt66=2;
                 }
@@ -5490,16 +5549,16 @@
             default:
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1439:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 66, 0, input);
+                    new NoViableAltException("1452:3: ( compound_operator[$base] | simple_operator[$base] | LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN )", 66, 0, input);
 
                 throw nvae;
             }
 
             switch (alt66) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1439:5: compound_operator[$base]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1452:5: compound_operator[$base]
                     {
-                    pushFollow(FOLLOW_compound_operator_in_constraint_expression3835);
+                    pushFollow(FOLLOW_compound_operator_in_constraint_expression3856);
                     compound_operator(base);
                     _fsp--;
                     if (failed) return ;
@@ -5507,9 +5566,9 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1440:5: simple_operator[$base]
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1453:5: simple_operator[$base]
                     {
-                    pushFollow(FOLLOW_simple_operator_in_constraint_expression3842);
+                    pushFollow(FOLLOW_simple_operator_in_constraint_expression3863);
                     simple_operator(base);
                     _fsp--;
                     if (failed) return ;
@@ -5517,19 +5576,19 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1441:5: LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1454:5: LEFT_PAREN or_restr_connective[$base] RIGHT_PAREN
                     {
-                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_constraint_expression3849); if (failed) return ;
+                    match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_constraint_expression3871); if (failed) return ;
                     if ( backtracking==0 ) {
 
                       			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
                       		
                     }
-                    pushFollow(FOLLOW_or_restr_connective_in_constraint_expression3858);
+                    pushFollow(FOLLOW_or_restr_connective_in_constraint_expression3880);
                     or_restr_connective(base);
                     _fsp--;
                     if (failed) return ;
-                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_constraint_expression3864); if (failed) return ;
+                    match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_constraint_expression3885); if (failed) return ;
 
                     }
                     break;
@@ -5552,80 +5611,89 @@
 
 
     // $ANTLR start simple_operator
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1450:1: simple_operator[RestrictionConnectiveDescr base] : (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF ) rd= expression_value[$base, op] ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1463:1: simple_operator[RestrictionConnectiveDescr base] : (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText] ;
     public final void simple_operator(RestrictionConnectiveDescr base) throws RecognitionException {
         Token t=null;
         Token n=null;
+        square_chunk_return param = null;
+
         RestrictionDescr rd = null;
 
 
 
         		String op = null;
+        		String paramText = null;
+        		boolean isNegated = false;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1454:2: ( (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF ) rd= expression_value[$base, op] )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1455:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF ) rd= expression_value[$base, op]
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1469:2: ( (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText] )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1470:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? ) rd= expression_value[$base, op, isNegated, paramText]
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1455:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF )
-            int alt67=14;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1470:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )
+            int alt69=16;
             switch ( input.LA(1) ) {
-            case 76:
+            case 78:
                 {
-                alt67=1;
+                alt69=1;
                 }
                 break;
-            case 77:
+            case 79:
                 {
-                alt67=2;
+                alt69=2;
                 }
                 break;
-            case 78:
+            case 80:
                 {
-                alt67=3;
+                alt69=3;
                 }
                 break;
-            case 79:
+            case 81:
                 {
-                alt67=4;
+                alt69=4;
                 }
                 break;
-            case 80:
+            case 82:
                 {
-                alt67=5;
+                alt69=5;
                 }
                 break;
-            case 81:
+            case 83:
                 {
-                alt67=6;
+                alt69=6;
                 }
                 break;
             case CONTAINS:
                 {
-                alt67=7;
+                alt69=7;
                 }
                 break;
             case NOT:
                 {
                 switch ( input.LA(2) ) {
-                case MATCHES:
+                case CONTAINS:
                     {
-                    alt67=12;
+                    alt69=8;
                     }
                     break;
-                case CONTAINS:
+                case TILDE:
                     {
-                    alt67=8;
+                    alt69=16;
                     }
                     break;
+                case MATCHES:
+                    {
+                    alt69=12;
+                    }
+                    break;
                 case MEMBEROF:
                     {
-                    alt67=14;
+                    alt69=14;
                     }
                     break;
                 default:
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("1455:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF )", 67, 8, input);
+                        new NoViableAltException("1470:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )", 69, 8, input);
 
                     throw nvae;
                 }
@@ -5634,167 +5702,234 @@
                 break;
             case EXCLUDES:
                 {
-                alt67=9;
+                alt69=9;
                 }
                 break;
             case MATCHES:
                 {
-                alt67=10;
+                alt69=10;
                 }
                 break;
             case SOUNDSLIKE:
                 {
-                alt67=11;
+                alt69=11;
                 }
                 break;
             case MEMBEROF:
                 {
-                alt67=13;
+                alt69=13;
                 }
                 break;
+            case TILDE:
+                {
+                alt69=15;
+                }
+                break;
             default:
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1455:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF )", 67, 0, input);
+                    new NoViableAltException("1470:3: (t= '==' | t= '>' | t= '>=' | t= '<' | t= '<=' | t= '!=' | t= CONTAINS | n= NOT t= CONTAINS | t= EXCLUDES | t= MATCHES | t= SOUNDSLIKE | n= NOT t= MATCHES | t= MEMBEROF | n= NOT t= MEMBEROF | TILDE t= ID (param= square_chunk )? | n= NOT TILDE t= ID (param= square_chunk )? )", 69, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt67) {
+            switch (alt69) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1455:5: t= '=='
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1470:5: t= '=='
                     {
                     t=(Token)input.LT(1);
-                    match(input,76,FOLLOW_76_in_simple_operator3895); if (failed) return ;
+                    match(input,78,FOLLOW_78_in_simple_operator3916); if (failed) return ;
 
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1456:5: t= '>'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1471:5: t= '>'
                     {
                     t=(Token)input.LT(1);
-                    match(input,77,FOLLOW_77_in_simple_operator3903); if (failed) return ;
+                    match(input,79,FOLLOW_79_in_simple_operator3924); if (failed) return ;
 
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1457:5: t= '>='
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1472:5: t= '>='
                     {
                     t=(Token)input.LT(1);
-                    match(input,78,FOLLOW_78_in_simple_operator3911); if (failed) return ;
+                    match(input,80,FOLLOW_80_in_simple_operator3932); if (failed) return ;
 
                     }
                     break;
                 case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1458:5: t= '<'
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1473:5: t= '<'
                     {
                     t=(Token)input.LT(1);
-                    match(input,79,FOLLOW_79_in_simple_operator3919); if (failed) return ;
+                    match(input,81,FOLLOW_81_in_simple_operator3940); if (failed) return ;
 
                     }
                     break;
                 case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1459:5: t= '<='
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1474:5: t= '<='
                     {
                     t=(Token)input.LT(1);
-                    match(input,80,FOLLOW_80_in_simple_operator3927); if (failed) return ;
+                    match(input,82,FOLLOW_82_in_simple_operator3948); if (failed) return ;
 
                     }
                     break;
                 case 6 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1460:5: t= '!='
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1475:5: t= '!='
                     {
                     t=(Token)input.LT(1);
-                    match(input,81,FOLLOW_81_in_simple_operator3935); if (failed) return ;
+                    match(input,83,FOLLOW_83_in_simple_operator3956); if (failed) return ;
 
                     }
                     break;
                 case 7 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1461:5: t= CONTAINS
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1476:25: t= CONTAINS
                     {
                     t=(Token)input.LT(1);
-                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator3943); if (failed) return ;
+                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator3984); if (failed) return ;
 
                     }
                     break;
                 case 8 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1462:5: n= NOT t= CONTAINS
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1477:25: n= NOT t= CONTAINS
                     {
                     n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator3951); if (failed) return ;
+                    match(input,NOT,FOLLOW_NOT_in_simple_operator4012); if (failed) return ;
                     t=(Token)input.LT(1);
-                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator3955); if (failed) return ;
+                    match(input,CONTAINS,FOLLOW_CONTAINS_in_simple_operator4016); if (failed) return ;
 
                     }
                     break;
                 case 9 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1463:5: t= EXCLUDES
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1478:25: t= EXCLUDES
                     {
                     t=(Token)input.LT(1);
-                    match(input,EXCLUDES,FOLLOW_EXCLUDES_in_simple_operator3963); if (failed) return ;
+                    match(input,EXCLUDES,FOLLOW_EXCLUDES_in_simple_operator4044); if (failed) return ;
 
                     }
                     break;
                 case 10 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1464:5: t= MATCHES
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1479:25: t= MATCHES
                     {
                     t=(Token)input.LT(1);
-                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator3971); if (failed) return ;
+                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator4072); if (failed) return ;
 
                     }
                     break;
                 case 11 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1465:5: t= SOUNDSLIKE
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1480:25: t= SOUNDSLIKE
                     {
                     t=(Token)input.LT(1);
-                    match(input,SOUNDSLIKE,FOLLOW_SOUNDSLIKE_in_simple_operator3979); if (failed) return ;
+                    match(input,SOUNDSLIKE,FOLLOW_SOUNDSLIKE_in_simple_operator4100); if (failed) return ;
 
                     }
                     break;
                 case 12 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1466:5: n= NOT t= MATCHES
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1481:25: n= NOT t= MATCHES
                     {
                     n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator3987); if (failed) return ;
+                    match(input,NOT,FOLLOW_NOT_in_simple_operator4128); if (failed) return ;
                     t=(Token)input.LT(1);
-                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator3991); if (failed) return ;
+                    match(input,MATCHES,FOLLOW_MATCHES_in_simple_operator4132); if (failed) return ;
 
                     }
                     break;
                 case 13 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1467:5: t= MEMBEROF
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1482:25: t= MEMBEROF
                     {
                     t=(Token)input.LT(1);
-                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator3999); if (failed) return ;
+                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator4160); if (failed) return ;
 
                     }
                     break;
                 case 14 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1468:5: n= NOT t= MEMBEROF
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1483:25: n= NOT t= MEMBEROF
                     {
                     n=(Token)input.LT(1);
-                    match(input,NOT,FOLLOW_NOT_in_simple_operator4007); if (failed) return ;
+                    match(input,NOT,FOLLOW_NOT_in_simple_operator4188); if (failed) return ;
                     t=(Token)input.LT(1);
-                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator4011); if (failed) return ;
+                    match(input,MEMBEROF,FOLLOW_MEMBEROF_in_simple_operator4192); if (failed) return ;
 
                     }
                     break;
+                case 15 :
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1484:5: TILDE t= ID (param= square_chunk )?
+                    {
+                    match(input,TILDE,FOLLOW_TILDE_in_simple_operator4198); if (failed) return ;
+                    t=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_simple_operator4202); if (failed) return ;
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1484:21: (param= square_chunk )?
+                    int alt67=2;
+                    int LA67_0 = input.LA(1);
 
+                    if ( (LA67_0==LEFT_SQUARE) ) {
+                        alt67=1;
+                    }
+                    switch (alt67) {
+                        case 1 :
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1484:21: param= square_chunk
+                            {
+                            pushFollow(FOLLOW_square_chunk_in_simple_operator4206);
+                            param=square_chunk();
+                            _fsp--;
+                            if (failed) return ;
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 16 :
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1485:5: n= NOT TILDE t= ID (param= square_chunk )?
+                    {
+                    n=(Token)input.LT(1);
+                    match(input,NOT,FOLLOW_NOT_in_simple_operator4215); if (failed) return ;
+                    match(input,TILDE,FOLLOW_TILDE_in_simple_operator4217); if (failed) return ;
+                    t=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_simple_operator4221); if (failed) return ;
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1485:27: (param= square_chunk )?
+                    int alt68=2;
+                    int LA68_0 = input.LA(1);
+
+                    if ( (LA68_0==LEFT_SQUARE) ) {
+                        alt68=1;
+                    }
+                    switch (alt68) {
+                        case 1 :
+                            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1485:27: param= square_chunk
+                            {
+                            pushFollow(FOLLOW_square_chunk_in_simple_operator4225);
+                            param=square_chunk();
+                            _fsp--;
+                            if (failed) return ;
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
             }
 
             if ( backtracking==0 ) {
 
                 		    location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
                                   location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, t.getText());
-              		    if( n != null ) {
-              		        op = "not "+t.getText();
-              		    } else {
-              		        op = t.getText();
-              		    }
+               	            op = t.getText();
+               	            isNegated = n != null;
+               	            if( param != null ) {
+                                      paramText = safeSubstring( input.toString(param.start,param.stop), 1, input.toString(param.start,param.stop).length()-1 );
+               	            } 
               		
             }
-            pushFollow(FOLLOW_expression_value_in_simple_operator4025);
-            rd=expression_value(base,  op);
+            pushFollow(FOLLOW_expression_value_in_simple_operator4240);
+            rd=expression_value(base,  op,  isNegated,  paramText);
             _fsp--;
             if (failed) return ;
 
@@ -5808,7 +5943,7 @@
         finally {
 
             		if ( rd == null && op != null ) {
-            		        base.addRestriction( new LiteralRestrictionDescr(op, null) );
+            		        base.addRestriction( new LiteralRestrictionDescr(op, false, null) );
             		}
             	
         }
@@ -5818,7 +5953,7 @@
 
 
     // $ANTLR start compound_operator
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1487:1: compound_operator[RestrictionConnectiveDescr base] : ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op] ( COMMA rd= expression_value[group, op] )* RIGHT_PAREN ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1504:1: compound_operator[RestrictionConnectiveDescr base] : ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN ;
     public final void compound_operator(RestrictionConnectiveDescr base) throws RecognitionException {
         RestrictionDescr rd = null;
 
@@ -5828,31 +5963,31 @@
         		RestrictionConnectiveDescr group = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1492:2: ( ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op] ( COMMA rd= expression_value[group, op] )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1493:3: ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op] ( COMMA rd= expression_value[group, op] )* RIGHT_PAREN
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1509:2: ( ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1510:3: ( IN | NOT IN ) LEFT_PAREN rd= expression_value[group, op, false, null] ( COMMA rd= expression_value[group, op, false, null] )* RIGHT_PAREN
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1493:3: ( IN | NOT IN )
-            int alt68=2;
-            int LA68_0 = input.LA(1);
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1510:3: ( IN | NOT IN )
+            int alt70=2;
+            int LA70_0 = input.LA(1);
 
-            if ( (LA68_0==IN) ) {
-                alt68=1;
+            if ( (LA70_0==IN) ) {
+                alt70=1;
             }
-            else if ( (LA68_0==NOT) ) {
-                alt68=2;
+            else if ( (LA70_0==NOT) ) {
+                alt70=2;
             }
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1493:3: ( IN | NOT IN )", 68, 0, input);
+                    new NoViableAltException("1510:3: ( IN | NOT IN )", 70, 0, input);
 
                 throw nvae;
             }
-            switch (alt68) {
+            switch (alt70) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1493:5: IN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1510:5: IN
                     {
-                    match(input,IN,FOLLOW_IN_in_compound_operator4055); if (failed) return ;
+                    match(input,IN,FOLLOW_IN_in_compound_operator4270); if (failed) return ;
                     if ( backtracking==0 ) {
 
                       			  op = "==";
@@ -5866,10 +6001,10 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1501:5: NOT IN
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1518:5: NOT IN
                     {
-                    match(input,NOT,FOLLOW_NOT_in_compound_operator4067); if (failed) return ;
-                    match(input,IN,FOLLOW_IN_in_compound_operator4069); if (failed) return ;
+                    match(input,NOT,FOLLOW_NOT_in_compound_operator4282); if (failed) return ;
+                    match(input,IN,FOLLOW_IN_in_compound_operator4284); if (failed) return ;
                     if ( backtracking==0 ) {
 
                       			  op = "!=";
@@ -5885,29 +6020,29 @@
 
             }
 
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_compound_operator4084); if (failed) return ;
-            pushFollow(FOLLOW_expression_value_in_compound_operator4088);
-            rd=expression_value(group,  op);
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_compound_operator4299); if (failed) return ;
+            pushFollow(FOLLOW_expression_value_in_compound_operator4303);
+            rd=expression_value(group,  op,  false,  null);
             _fsp--;
             if (failed) return ;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1511:3: ( COMMA rd= expression_value[group, op] )*
-            loop69:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1528:3: ( COMMA rd= expression_value[group, op, false, null] )*
+            loop71:
             do {
-                int alt69=2;
-                int LA69_0 = input.LA(1);
+                int alt71=2;
+                int LA71_0 = input.LA(1);
 
-                if ( (LA69_0==COMMA) ) {
-                    alt69=1;
+                if ( (LA71_0==COMMA) ) {
+                    alt71=1;
                 }
 
 
-                switch (alt69) {
+                switch (alt71) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1511:5: COMMA rd= expression_value[group, op]
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1528:5: COMMA rd= expression_value[group, op, false, null]
             	    {
-            	    match(input,COMMA,FOLLOW_COMMA_in_compound_operator4095); if (failed) return ;
-            	    pushFollow(FOLLOW_expression_value_in_compound_operator4099);
-            	    rd=expression_value(group,  op);
+            	    match(input,COMMA,FOLLOW_COMMA_in_compound_operator4310); if (failed) return ;
+            	    pushFollow(FOLLOW_expression_value_in_compound_operator4314);
+            	    rd=expression_value(group,  op,  false,  null);
             	    _fsp--;
             	    if (failed) return ;
 
@@ -5915,11 +6050,11 @@
             	    break;
 
             	default :
-            	    break loop69;
+            	    break loop71;
                 }
             } while (true);
 
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_compound_operator4108); if (failed) return ;
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_compound_operator4323); if (failed) return ;
             if ( backtracking==0 ) {
 
               			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
@@ -5941,8 +6076,8 @@
 
 
     // $ANTLR start expression_value
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1518:1: expression_value[RestrictionConnectiveDescr base, String op] returns [RestrictionDescr rd] : (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) ;
-    public final RestrictionDescr expression_value(RestrictionConnectiveDescr base, String op) throws RecognitionException {
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1535:1: expression_value[RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText] returns [RestrictionDescr rd] : (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) ;
+    public final RestrictionDescr expression_value(RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText) throws RecognitionException {
         RestrictionDescr rd = null;
 
         accessor_path_return ap = null;
@@ -5956,15 +6091,16 @@
         		rd = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1522:2: ( (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1523:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1539:2: ( (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1540:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1523:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
-            int alt70=3;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1540:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )
+            int alt72=3;
             switch ( input.LA(1) ) {
             case PACKAGE:
             case IMPORT:
             case FUNCTION:
+            case EVENT:
             case ID:
             case GLOBAL:
             case QUERY:
@@ -5990,7 +6126,7 @@
             case IN:
             case THEN:
                 {
-                alt70=1;
+                alt72=1;
                 }
                 break;
             case STRING:
@@ -5999,36 +6135,36 @@
             case FLOAT:
             case NULL:
                 {
-                alt70=2;
+                alt72=2;
                 }
                 break;
             case LEFT_PAREN:
                 {
-                alt70=3;
+                alt72=3;
                 }
                 break;
             default:
                 if (backtracking>0) {failed=true; return rd;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1523:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )", 70, 0, input);
+                    new NoViableAltException("1540:3: (ap= accessor_path | lc= literal_constraint | rvc= paren_chunk )", 72, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt70) {
+            switch (alt72) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1523:5: ap= accessor_path
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1540:5: ap= accessor_path
                     {
-                    pushFollow(FOLLOW_accessor_path_in_expression_value4142);
+                    pushFollow(FOLLOW_accessor_path_in_expression_value4357);
                     ap=accessor_path();
                     _fsp--;
                     if (failed) return rd;
                     if ( backtracking==0 ) {
                        
                       			        if( ap.text.indexOf( '.' ) > -1 || ap.text.indexOf( '[' ) > -1) {
-                      					rd = new QualifiedIdentifierRestrictionDescr(op, ap.text);
+                      					rd = new QualifiedIdentifierRestrictionDescr(op, isNegated, paramText, ap.text);
                       				} else {
-                      					rd = new VariableRestrictionDescr(op, ap.text);
+                      					rd = new VariableRestrictionDescr(op, isNegated, paramText, ap.text);
                       				}
                       			
                     }
@@ -6036,30 +6172,30 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1531:5: lc= literal_constraint
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1548:5: lc= literal_constraint
                     {
-                    pushFollow(FOLLOW_literal_constraint_in_expression_value4162);
+                    pushFollow(FOLLOW_literal_constraint_in_expression_value4377);
                     lc=literal_constraint();
                     _fsp--;
                     if (failed) return rd;
                     if ( backtracking==0 ) {
                        
-                      				rd = new LiteralRestrictionDescr(op, lc.text, lc.type );
+                      				rd = new LiteralRestrictionDescr(op, isNegated, paramText, lc.text, lc.type );
                       			
                     }
 
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1535:5: rvc= paren_chunk
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1552:5: rvc= paren_chunk
                     {
-                    pushFollow(FOLLOW_paren_chunk_in_expression_value4176);
+                    pushFollow(FOLLOW_paren_chunk_in_expression_value4391);
                     rvc=paren_chunk();
                     _fsp--;
                     if (failed) return rd;
                     if ( backtracking==0 ) {
                        
-                      				rd = new ReturnValueRestrictionDescr(op, safeSubstring( input.toString(rvc.start,rvc.stop), 1, input.toString(rvc.start,rvc.stop).length()-1) );							
+                      				rd = new ReturnValueRestrictionDescr(op, isNegated, paramText, safeSubstring( input.toString(rvc.start,rvc.stop), 1, input.toString(rvc.start,rvc.stop).length()-1) );							
                       			
                     }
 
@@ -6096,7 +6232,7 @@
     };
 
     // $ANTLR start literal_constraint
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1548:1: literal_constraint returns [String text, int type] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1565:1: literal_constraint returns [String text, int type] : (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) ;
     public final literal_constraint_return literal_constraint() throws RecognitionException {
         literal_constraint_return retval = new literal_constraint_return();
         retval.start = input.LT(1);
@@ -6107,51 +6243,51 @@
         		retval.text = null;
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1552:2: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1552:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1569:2: ( (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL ) )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1569:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
             {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1552:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
-            int alt71=5;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1569:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )
+            int alt73=5;
             switch ( input.LA(1) ) {
             case STRING:
                 {
-                alt71=1;
+                alt73=1;
                 }
                 break;
             case INT:
                 {
-                alt71=2;
+                alt73=2;
                 }
                 break;
             case FLOAT:
                 {
-                alt71=3;
+                alt73=3;
                 }
                 break;
             case BOOL:
                 {
-                alt71=4;
+                alt73=4;
                 }
                 break;
             case NULL:
                 {
-                alt71=5;
+                alt73=5;
                 }
                 break;
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1552:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )", 71, 0, input);
+                    new NoViableAltException("1569:4: (t= STRING | t= INT | t= FLOAT | t= BOOL | t= NULL )", 73, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt71) {
+            switch (alt73) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1552:6: t= STRING
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1569:6: t= STRING
                     {
                     t=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_literal_constraint4219); if (failed) return retval;
+                    match(input,STRING,FOLLOW_STRING_in_literal_constraint4434); if (failed) return retval;
                     if ( backtracking==0 ) {
                        retval.text = getString( t.getText() ); retval.type = LiteralRestrictionDescr.TYPE_STRING; 
                     }
@@ -6159,10 +6295,10 @@
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1553:5: t= INT
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1570:5: t= INT
                     {
                     t=(Token)input.LT(1);
-                    match(input,INT,FOLLOW_INT_in_literal_constraint4230); if (failed) return retval;
+                    match(input,INT,FOLLOW_INT_in_literal_constraint4445); if (failed) return retval;
                     if ( backtracking==0 ) {
                        retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_NUMBER; 
                     }
@@ -6170,10 +6306,10 @@
                     }
                     break;
                 case 3 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1554:5: t= FLOAT
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1571:5: t= FLOAT
                     {
                     t=(Token)input.LT(1);
-                    match(input,FLOAT,FOLLOW_FLOAT_in_literal_constraint4243); if (failed) return retval;
+                    match(input,FLOAT,FOLLOW_FLOAT_in_literal_constraint4458); if (failed) return retval;
                     if ( backtracking==0 ) {
                        retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_NUMBER; 
                     }
@@ -6181,10 +6317,10 @@
                     }
                     break;
                 case 4 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1555:5: t= BOOL
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1572:5: t= BOOL
                     {
                     t=(Token)input.LT(1);
-                    match(input,BOOL,FOLLOW_BOOL_in_literal_constraint4254); if (failed) return retval;
+                    match(input,BOOL,FOLLOW_BOOL_in_literal_constraint4469); if (failed) return retval;
                     if ( backtracking==0 ) {
                        retval.text = t.getText(); retval.type = LiteralRestrictionDescr.TYPE_BOOLEAN; 
                     }
@@ -6192,10 +6328,10 @@
                     }
                     break;
                 case 5 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1556:5: t= NULL
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1573:5: t= NULL
                     {
                     t=(Token)input.LT(1);
-                    match(input,NULL,FOLLOW_NULL_in_literal_constraint4266); if (failed) return retval;
+                    match(input,NULL,FOLLOW_NULL_in_literal_constraint4481); if (failed) return retval;
                     if ( backtracking==0 ) {
                        retval.text = null; retval.type = LiteralRestrictionDescr.TYPE_NULL; 
                     }
@@ -6223,7 +6359,7 @@
 
 
     // $ANTLR start predicate
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1560:1: predicate[ConditionalElementDescr base] : text= paren_chunk ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1577:1: predicate[ConditionalElementDescr base] : text= paren_chunk ;
     public final void predicate(ConditionalElementDescr base) throws RecognitionException {
         paren_chunk_return text = null;
 
@@ -6232,10 +6368,10 @@
         		PredicateDescr d = null;
                 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1564:2: (text= paren_chunk )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1565:3: text= paren_chunk
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1581:2: (text= paren_chunk )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1582:3: text= paren_chunk
             {
-            pushFollow(FOLLOW_paren_chunk_in_predicate4304);
+            pushFollow(FOLLOW_paren_chunk_in_predicate4519);
             text=paren_chunk();
             _fsp--;
             if (failed) return ;
@@ -6267,35 +6403,35 @@
     };
 
     // $ANTLR start curly_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1577:1: curly_chunk : LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1594:1: curly_chunk : LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY ;
     public final curly_chunk_return curly_chunk() throws RecognitionException {
         curly_chunk_return retval = new curly_chunk_return();
         retval.start = input.LT(1);
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1578:2: ( LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1579:3: LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1595:2: ( LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1596:3: LEFT_CURLY (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )* RIGHT_CURLY
             {
-            match(input,LEFT_CURLY,FOLLOW_LEFT_CURLY_in_curly_chunk4322); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1579:14: (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )*
-            loop72:
+            match(input,LEFT_CURLY,FOLLOW_LEFT_CURLY_in_curly_chunk4537); if (failed) return retval;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1596:14: (~ ( LEFT_CURLY | RIGHT_CURLY ) | curly_chunk )*
+            loop74:
             do {
-                int alt72=3;
-                int LA72_0 = input.LA(1);
+                int alt74=3;
+                int LA74_0 = input.LA(1);
 
-                if ( ((LA72_0>=PACKAGE && LA72_0<=NULL)||(LA72_0>=LEFT_SQUARE && LA72_0<=81)) ) {
-                    alt72=1;
+                if ( ((LA74_0>=PACKAGE && LA74_0<=NULL)||(LA74_0>=LEFT_SQUARE && LA74_0<=83)) ) {
+                    alt74=1;
                 }
-                else if ( (LA72_0==LEFT_CURLY) ) {
-                    alt72=2;
+                else if ( (LA74_0==LEFT_CURLY) ) {
+                    alt74=2;
                 }
 
 
-                switch (alt72) {
+                switch (alt74) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1579:16: ~ ( LEFT_CURLY | RIGHT_CURLY )
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1596:16: ~ ( LEFT_CURLY | RIGHT_CURLY )
             	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=NULL)||(input.LA(1)>=LEFT_SQUARE && input.LA(1)<=81) ) {
+            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=NULL)||(input.LA(1)>=LEFT_SQUARE && input.LA(1)<=83) ) {
             	        input.consume();
             	        errorRecovery=false;failed=false;
             	    }
@@ -6303,16 +6439,16 @@
             	        if (backtracking>0) {failed=true; return retval;}
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_curly_chunk4326);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_curly_chunk4541);    throw mse;
             	    }
 
 
             	    }
             	    break;
             	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1579:44: curly_chunk
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1596:44: curly_chunk
             	    {
-            	    pushFollow(FOLLOW_curly_chunk_in_curly_chunk4335);
+            	    pushFollow(FOLLOW_curly_chunk_in_curly_chunk4550);
             	    curly_chunk();
             	    _fsp--;
             	    if (failed) return retval;
@@ -6321,11 +6457,11 @@
             	    break;
 
             	default :
-            	    break loop72;
+            	    break loop74;
                 }
             } while (true);
 
-            match(input,RIGHT_CURLY,FOLLOW_RIGHT_CURLY_in_curly_chunk4340); if (failed) return retval;
+            match(input,RIGHT_CURLY,FOLLOW_RIGHT_CURLY_in_curly_chunk4555); if (failed) return retval;
 
             }
 
@@ -6346,35 +6482,35 @@
     };
 
     // $ANTLR start paren_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1582:1: paren_chunk : LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:1: paren_chunk : LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN ;
     public final paren_chunk_return paren_chunk() throws RecognitionException {
         paren_chunk_return retval = new paren_chunk_return();
         retval.start = input.LT(1);
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1583:2: ( LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1584:3: LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1600:2: ( LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1601:3: LEFT_PAREN (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )* RIGHT_PAREN
             {
-            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_paren_chunk4354); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1584:14: (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )*
-            loop73:
+            match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_paren_chunk4569); if (failed) return retval;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1601:14: (~ ( LEFT_PAREN | RIGHT_PAREN ) | paren_chunk )*
+            loop75:
             do {
-                int alt73=3;
-                int LA73_0 = input.LA(1);
+                int alt75=3;
+                int LA75_0 = input.LA(1);
 
-                if ( ((LA73_0>=PACKAGE && LA73_0<=GLOBAL)||LA73_0==COMMA||(LA73_0>=QUERY && LA73_0<=81)) ) {
-                    alt73=1;
+                if ( ((LA75_0>=PACKAGE && LA75_0<=GLOBAL)||LA75_0==COMMA||(LA75_0>=QUERY && LA75_0<=83)) ) {
+                    alt75=1;
                 }
-                else if ( (LA73_0==LEFT_PAREN) ) {
-                    alt73=2;
+                else if ( (LA75_0==LEFT_PAREN) ) {
+                    alt75=2;
                 }
 
 
-                switch (alt73) {
+                switch (alt75) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1584:16: ~ ( LEFT_PAREN | RIGHT_PAREN )
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1601:16: ~ ( LEFT_PAREN | RIGHT_PAREN )
             	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=GLOBAL)||input.LA(1)==COMMA||(input.LA(1)>=QUERY && input.LA(1)<=81) ) {
+            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=GLOBAL)||input.LA(1)==COMMA||(input.LA(1)>=QUERY && input.LA(1)<=83) ) {
             	        input.consume();
             	        errorRecovery=false;failed=false;
             	    }
@@ -6382,16 +6518,16 @@
             	        if (backtracking>0) {failed=true; return retval;}
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_paren_chunk4358);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_paren_chunk4573);    throw mse;
             	    }
 
 
             	    }
             	    break;
             	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1584:44: paren_chunk
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1601:44: paren_chunk
             	    {
-            	    pushFollow(FOLLOW_paren_chunk_in_paren_chunk4367);
+            	    pushFollow(FOLLOW_paren_chunk_in_paren_chunk4582);
             	    paren_chunk();
             	    _fsp--;
             	    if (failed) return retval;
@@ -6400,11 +6536,11 @@
             	    break;
 
             	default :
-            	    break loop73;
+            	    break loop75;
                 }
             } while (true);
 
-            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_paren_chunk4372); if (failed) return retval;
+            match(input,RIGHT_PAREN,FOLLOW_RIGHT_PAREN_in_paren_chunk4587); if (failed) return retval;
 
             }
 
@@ -6425,35 +6561,35 @@
     };
 
     // $ANTLR start square_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1587:1: square_chunk : LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1604:1: square_chunk : LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE ;
     public final square_chunk_return square_chunk() throws RecognitionException {
         square_chunk_return retval = new square_chunk_return();
         retval.start = input.LT(1);
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1588:2: ( LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1589:3: LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1605:2: ( LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:3: LEFT_SQUARE (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )* RIGHT_SQUARE
             {
-            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_square_chunk4385); if (failed) return retval;
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1589:15: (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )*
-            loop74:
+            match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_square_chunk4600); if (failed) return retval;
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:15: (~ ( LEFT_SQUARE | RIGHT_SQUARE ) | square_chunk )*
+            loop76:
             do {
-                int alt74=3;
-                int LA74_0 = input.LA(1);
+                int alt76=3;
+                int LA76_0 = input.LA(1);
 
-                if ( ((LA74_0>=PACKAGE && LA74_0<=RIGHT_CURLY)||(LA74_0>=THEN && LA74_0<=81)) ) {
-                    alt74=1;
+                if ( ((LA76_0>=PACKAGE && LA76_0<=RIGHT_CURLY)||(LA76_0>=THEN && LA76_0<=83)) ) {
+                    alt76=1;
                 }
-                else if ( (LA74_0==LEFT_SQUARE) ) {
-                    alt74=2;
+                else if ( (LA76_0==LEFT_SQUARE) ) {
+                    alt76=2;
                 }
 
 
-                switch (alt74) {
+                switch (alt76) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1589:17: ~ ( LEFT_SQUARE | RIGHT_SQUARE )
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:17: ~ ( LEFT_SQUARE | RIGHT_SQUARE )
             	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=RIGHT_CURLY)||(input.LA(1)>=THEN && input.LA(1)<=81) ) {
+            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=RIGHT_CURLY)||(input.LA(1)>=THEN && input.LA(1)<=83) ) {
             	        input.consume();
             	        errorRecovery=false;failed=false;
             	    }
@@ -6461,16 +6597,16 @@
             	        if (backtracking>0) {failed=true; return retval;}
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_square_chunk4389);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_square_chunk4604);    throw mse;
             	    }
 
 
             	    }
             	    break;
             	case 2 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1589:47: square_chunk
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1606:47: square_chunk
             	    {
-            	    pushFollow(FOLLOW_square_chunk_in_square_chunk4398);
+            	    pushFollow(FOLLOW_square_chunk_in_square_chunk4613);
             	    square_chunk();
             	    _fsp--;
             	    if (failed) return retval;
@@ -6479,11 +6615,11 @@
             	    break;
 
             	default :
-            	    break loop74;
+            	    break loop76;
                 }
             } while (true);
 
-            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_square_chunk4403); if (failed) return retval;
+            match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_square_chunk4618); if (failed) return retval;
 
             }
 
@@ -6505,76 +6641,76 @@
     };
 
     // $ANTLR start qualified_id
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1592:1: qualified_id returns [ String text ] : ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:1: qualified_id returns [ String text ] : ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
     public final qualified_id_return qualified_id() throws RecognitionException {
         qualified_id_return retval = new qualified_id_return();
         retval.start = input.LT(1);
 
-        Token ID52=null;
-        identifier_return identifier53 = null;
+        Token ID53=null;
+        identifier_return identifier54 = null;
 
 
 
         	        StringBuffer buf = new StringBuffer();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:2: ( ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:5: ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:2: ( ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:5: ID ( DOT identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
             {
-            ID52=(Token)input.LT(1);
-            match(input,ID,FOLLOW_ID_in_qualified_id4432); if (failed) return retval;
+            ID53=(Token)input.LT(1);
+            match(input,ID,FOLLOW_ID_in_qualified_id4647); if (failed) return retval;
             if ( backtracking==0 ) {
-              buf.append(ID52.getText());
+              buf.append(ID53.getText());
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:32: ( DOT identifier )*
-            loop75:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:32: ( DOT identifier )*
+            loop77:
             do {
-                int alt75=2;
-                int LA75_0 = input.LA(1);
+                int alt77=2;
+                int LA77_0 = input.LA(1);
 
-                if ( (LA75_0==DOT) ) {
-                    alt75=1;
+                if ( (LA77_0==DOT) ) {
+                    alt77=1;
                 }
 
 
-                switch (alt75) {
+                switch (alt77) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:34: DOT identifier
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:34: DOT identifier
             	    {
-            	    match(input,DOT,FOLLOW_DOT_in_qualified_id4438); if (failed) return retval;
-            	    pushFollow(FOLLOW_identifier_in_qualified_id4440);
-            	    identifier53=identifier();
+            	    match(input,DOT,FOLLOW_DOT_in_qualified_id4653); if (failed) return retval;
+            	    pushFollow(FOLLOW_identifier_in_qualified_id4655);
+            	    identifier54=identifier();
             	    _fsp--;
             	    if (failed) return retval;
             	    if ( backtracking==0 ) {
-            	      buf.append("."+input.toString(identifier53.start,identifier53.stop));
+            	      buf.append("."+input.toString(identifier54.start,identifier54.stop));
             	    }
 
             	    }
             	    break;
 
             	default :
-            	    break loop75;
+            	    break loop77;
                 }
             } while (true);
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:88: ( LEFT_SQUARE RIGHT_SQUARE )*
-            loop76:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:88: ( LEFT_SQUARE RIGHT_SQUARE )*
+            loop78:
             do {
-                int alt76=2;
-                int LA76_0 = input.LA(1);
+                int alt78=2;
+                int LA78_0 = input.LA(1);
 
-                if ( (LA76_0==LEFT_SQUARE) ) {
-                    alt76=1;
+                if ( (LA78_0==LEFT_SQUARE) ) {
+                    alt78=1;
                 }
 
 
-                switch (alt76) {
+                switch (alt78) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1599:90: LEFT_SQUARE RIGHT_SQUARE
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1616:90: LEFT_SQUARE RIGHT_SQUARE
             	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_qualified_id4449); if (failed) return retval;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_qualified_id4451); if (failed) return retval;
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_qualified_id4664); if (failed) return retval;
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_qualified_id4666); if (failed) return retval;
             	    if ( backtracking==0 ) {
             	      buf.append("[]");
             	    }
@@ -6583,7 +6719,7 @@
             	    break;
 
             	default :
-            	    break loop76;
+            	    break loop78;
                 }
             } while (true);
 
@@ -6610,7 +6746,7 @@
 
 
     // $ANTLR start dotted_name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1602:1: dotted_name returns [ String text ] : i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1619:1: dotted_name returns [ String text ] : i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* ;
     public final String dotted_name() throws RecognitionException {
         String text = null;
 
@@ -6621,33 +6757,33 @@
         	        StringBuffer buf = new StringBuffer();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:2: (i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:4: i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:2: (i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:4: i= identifier ( DOT i= identifier )* ( LEFT_SQUARE RIGHT_SQUARE )*
             {
-            pushFollow(FOLLOW_identifier_in_dotted_name4485);
+            pushFollow(FOLLOW_identifier_in_dotted_name4700);
             i=identifier();
             _fsp--;
             if (failed) return text;
             if ( backtracking==0 ) {
               buf.append(input.toString(i.start,i.stop));
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:40: ( DOT i= identifier )*
-            loop77:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:40: ( DOT i= identifier )*
+            loop79:
             do {
-                int alt77=2;
-                int LA77_0 = input.LA(1);
+                int alt79=2;
+                int LA79_0 = input.LA(1);
 
-                if ( (LA77_0==DOT) ) {
-                    alt77=1;
+                if ( (LA79_0==DOT) ) {
+                    alt79=1;
                 }
 
 
-                switch (alt77) {
+                switch (alt79) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:42: DOT i= identifier
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:42: DOT i= identifier
             	    {
-            	    match(input,DOT,FOLLOW_DOT_in_dotted_name4491); if (failed) return text;
-            	    pushFollow(FOLLOW_identifier_in_dotted_name4495);
+            	    match(input,DOT,FOLLOW_DOT_in_dotted_name4706); if (failed) return text;
+            	    pushFollow(FOLLOW_identifier_in_dotted_name4710);
             	    i=identifier();
             	    _fsp--;
             	    if (failed) return text;
@@ -6659,27 +6795,27 @@
             	    break;
 
             	default :
-            	    break loop77;
+            	    break loop79;
                 }
             } while (true);
 
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:89: ( LEFT_SQUARE RIGHT_SQUARE )*
-            loop78:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:89: ( LEFT_SQUARE RIGHT_SQUARE )*
+            loop80:
             do {
-                int alt78=2;
-                int LA78_0 = input.LA(1);
+                int alt80=2;
+                int LA80_0 = input.LA(1);
 
-                if ( (LA78_0==LEFT_SQUARE) ) {
-                    alt78=1;
+                if ( (LA80_0==LEFT_SQUARE) ) {
+                    alt80=1;
                 }
 
 
-                switch (alt78) {
+                switch (alt80) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1609:91: LEFT_SQUARE RIGHT_SQUARE
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1626:91: LEFT_SQUARE RIGHT_SQUARE
             	    {
-            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_dotted_name4504); if (failed) return text;
-            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_dotted_name4506); if (failed) return text;
+            	    match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_dotted_name4719); if (failed) return text;
+            	    match(input,RIGHT_SQUARE,FOLLOW_RIGHT_SQUARE_in_dotted_name4721); if (failed) return text;
             	    if ( backtracking==0 ) {
             	      buf.append("[]");
             	    }
@@ -6688,7 +6824,7 @@
             	    break;
 
             	default :
-            	    break loop78;
+            	    break loop80;
                 }
             } while (true);
 
@@ -6716,7 +6852,7 @@
     };
 
     // $ANTLR start accessor_path
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1612:1: accessor_path returns [ String text ] : a= accessor_element ( DOT a= accessor_element )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1629:1: accessor_path returns [ String text ] : a= accessor_element ( DOT a= accessor_element )* ;
     public final accessor_path_return accessor_path() throws RecognitionException {
         accessor_path_return retval = new accessor_path_return();
         retval.start = input.LT(1);
@@ -6728,33 +6864,33 @@
         	        StringBuffer buf = new StringBuffer();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1619:2: (a= accessor_element ( DOT a= accessor_element )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1619:4: a= accessor_element ( DOT a= accessor_element )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:2: (a= accessor_element ( DOT a= accessor_element )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:4: a= accessor_element ( DOT a= accessor_element )*
             {
-            pushFollow(FOLLOW_accessor_element_in_accessor_path4540);
+            pushFollow(FOLLOW_accessor_element_in_accessor_path4755);
             a=accessor_element();
             _fsp--;
             if (failed) return retval;
             if ( backtracking==0 ) {
               buf.append(a);
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1619:46: ( DOT a= accessor_element )*
-            loop79:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:46: ( DOT a= accessor_element )*
+            loop81:
             do {
-                int alt79=2;
-                int LA79_0 = input.LA(1);
+                int alt81=2;
+                int LA81_0 = input.LA(1);
 
-                if ( (LA79_0==DOT) ) {
-                    alt79=1;
+                if ( (LA81_0==DOT) ) {
+                    alt81=1;
                 }
 
 
-                switch (alt79) {
+                switch (alt81) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1619:48: DOT a= accessor_element
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:48: DOT a= accessor_element
             	    {
-            	    match(input,DOT,FOLLOW_DOT_in_accessor_path4546); if (failed) return retval;
-            	    pushFollow(FOLLOW_accessor_element_in_accessor_path4550);
+            	    match(input,DOT,FOLLOW_DOT_in_accessor_path4761); if (failed) return retval;
+            	    pushFollow(FOLLOW_accessor_element_in_accessor_path4765);
             	    a=accessor_element();
             	    _fsp--;
             	    if (failed) return retval;
@@ -6766,7 +6902,7 @@
             	    break;
 
             	default :
-            	    break loop79;
+            	    break loop81;
                 }
             } while (true);
 
@@ -6793,7 +6929,7 @@
 
 
     // $ANTLR start accessor_element
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1622:1: accessor_element returns [ String text ] : i= identifier (s= square_chunk )* ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1639:1: accessor_element returns [ String text ] : i= identifier (s= square_chunk )* ;
     public final String accessor_element() throws RecognitionException {
         String text = null;
 
@@ -6806,32 +6942,32 @@
         	        StringBuffer buf = new StringBuffer();
         	
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1629:2: (i= identifier (s= square_chunk )* )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1630:3: i= identifier (s= square_chunk )*
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1646:2: (i= identifier (s= square_chunk )* )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1647:3: i= identifier (s= square_chunk )*
             {
-            pushFollow(FOLLOW_identifier_in_accessor_element4588);
+            pushFollow(FOLLOW_identifier_in_accessor_element4803);
             i=identifier();
             _fsp--;
             if (failed) return text;
             if ( backtracking==0 ) {
               buf.append(input.toString(i.start,i.stop));
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1630:39: (s= square_chunk )*
-            loop80:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1647:39: (s= square_chunk )*
+            loop82:
             do {
-                int alt80=2;
-                int LA80_0 = input.LA(1);
+                int alt82=2;
+                int LA82_0 = input.LA(1);
 
-                if ( (LA80_0==LEFT_SQUARE) ) {
-                    alt80=1;
+                if ( (LA82_0==LEFT_SQUARE) ) {
+                    alt82=1;
                 }
 
 
-                switch (alt80) {
+                switch (alt82) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1630:40: s= square_chunk
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1647:40: s= square_chunk
             	    {
-            	    pushFollow(FOLLOW_square_chunk_in_accessor_element4595);
+            	    pushFollow(FOLLOW_square_chunk_in_accessor_element4810);
             	    s=square_chunk();
             	    _fsp--;
             	    if (failed) return text;
@@ -6843,7 +6979,7 @@
             	    break;
 
             	default :
-            	    break loop80;
+            	    break loop82;
                 }
             } while (true);
 
@@ -6868,36 +7004,36 @@
 
 
     // $ANTLR start rhs_chunk
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1633:1: rhs_chunk[RuleDescr rule] : THEN (~ END )* loc= END opt_semicolon ;
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1650:1: rhs_chunk[RuleDescr rule] : THEN (~ END )* loc= END opt_semicolon ;
     public final void rhs_chunk(RuleDescr rule) throws RecognitionException {
         Token loc=null;
-        Token THEN54=null;
+        Token THEN55=null;
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1634:2: ( THEN (~ END )* loc= END opt_semicolon )
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1635:3: THEN (~ END )* loc= END opt_semicolon
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1651:2: ( THEN (~ END )* loc= END opt_semicolon )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1652:3: THEN (~ END )* loc= END opt_semicolon
             {
-            THEN54=(Token)input.LT(1);
-            match(input,THEN,FOLLOW_THEN_in_rhs_chunk4616); if (failed) return ;
+            THEN55=(Token)input.LT(1);
+            match(input,THEN,FOLLOW_THEN_in_rhs_chunk4831); if (failed) return ;
             if ( backtracking==0 ) {
                location.setType( Location.LOCATION_RHS ); 
             }
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:3: (~ END )*
-            loop81:
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1653:3: (~ END )*
+            loop83:
             do {
-                int alt81=2;
-                int LA81_0 = input.LA(1);
+                int alt83=2;
+                int LA83_0 = input.LA(1);
 
-                if ( ((LA81_0>=PACKAGE && LA81_0<=QUERY)||(LA81_0>=TEMPLATE && LA81_0<=81)) ) {
-                    alt81=1;
+                if ( ((LA83_0>=PACKAGE && LA83_0<=QUERY)||(LA83_0>=TEMPLATE && LA83_0<=83)) ) {
+                    alt83=1;
                 }
 
 
-                switch (alt81) {
+                switch (alt83) {
             	case 1 :
-            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1636:5: ~ END
+            	    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1653:5: ~ END
             	    {
-            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=QUERY)||(input.LA(1)>=TEMPLATE && input.LA(1)<=81) ) {
+            	    if ( (input.LA(1)>=PACKAGE && input.LA(1)<=QUERY)||(input.LA(1)>=TEMPLATE && input.LA(1)<=83) ) {
             	        input.consume();
             	        errorRecovery=false;failed=false;
             	    }
@@ -6905,7 +7041,7 @@
             	        if (backtracking>0) {failed=true; return ;}
             	        MismatchedSetException mse =
             	            new MismatchedSetException(null,input);
-            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_rhs_chunk4624);    throw mse;
+            	        recoverFromMismatchedSet(input,mse,FOLLOW_set_in_rhs_chunk4839);    throw mse;
             	    }
 
 
@@ -6913,20 +7049,20 @@
             	    break;
 
             	default :
-            	    break loop81;
+            	    break loop83;
                 }
             } while (true);
 
             loc=(Token)input.LT(1);
-            match(input,END,FOLLOW_END_in_rhs_chunk4648); if (failed) return ;
-            pushFollow(FOLLOW_opt_semicolon_in_rhs_chunk4650);
+            match(input,END,FOLLOW_END_in_rhs_chunk4863); if (failed) return ;
+            pushFollow(FOLLOW_opt_semicolon_in_rhs_chunk4865);
             opt_semicolon();
             _fsp--;
             if (failed) return ;
             if ( backtracking==0 ) {
 
                                   // ignoring first line in the consequence
-                                  String buf = input.toString( THEN54, loc );
+                                  String buf = input.toString( THEN55, loc );
                                   // removing final END keyword
                                   int idx=4;
                                   while( idx < buf.length()-3 && (buf.charAt(idx) == ' ' || buf.charAt(idx) == '\t') ) {
@@ -6936,7 +7072,7 @@
                                   if( idx < buf.length()-3 && buf.charAt(idx) == '\n' ) idx++;
                                   buf = safeSubstring( buf, idx, buf.length()-3 );
               		    rule.setConsequence( buf );
-                   		    rule.setConsequenceLocation(offset(THEN54.getLine()), THEN54.getCharPositionInLine());
+                   		    rule.setConsequenceLocation(offset(THEN55.getLine()), THEN55.getCharPositionInLine());
                		    rule.setEndCharacter( ((CommonToken)loc).getStopIndex() );
                		    location.setProperty( Location.LOCATION_RHS_CONTENT, rule.getConsequence() );
                               
@@ -6957,50 +7093,50 @@
 
 
     // $ANTLR start name
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1656:1: name returns [String name] : ( ID | STRING );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1673:1: name returns [String name] : ( ID | STRING );
     public final String name() throws RecognitionException {
         String name = null;
 
-        Token ID55=null;
-        Token STRING56=null;
+        Token ID56=null;
+        Token STRING57=null;
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1657:2: ( ID | STRING )
-            int alt82=2;
-            int LA82_0 = input.LA(1);
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1674:2: ( ID | STRING )
+            int alt84=2;
+            int LA84_0 = input.LA(1);
 
-            if ( (LA82_0==ID) ) {
-                alt82=1;
+            if ( (LA84_0==ID) ) {
+                alt84=1;
             }
-            else if ( (LA82_0==STRING) ) {
-                alt82=2;
+            else if ( (LA84_0==STRING) ) {
+                alt84=2;
             }
             else {
                 if (backtracking>0) {failed=true; return name;}
                 NoViableAltException nvae =
-                    new NoViableAltException("1656:1: name returns [String name] : ( ID | STRING );", 82, 0, input);
+                    new NoViableAltException("1673:1: name returns [String name] : ( ID | STRING );", 84, 0, input);
 
                 throw nvae;
             }
-            switch (alt82) {
+            switch (alt84) {
                 case 1 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1657:5: ID
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1674:5: ID
                     {
-                    ID55=(Token)input.LT(1);
-                    match(input,ID,FOLLOW_ID_in_name4684); if (failed) return name;
+                    ID56=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_name4899); if (failed) return name;
                     if ( backtracking==0 ) {
-                       name = ID55.getText(); 
+                       name = ID56.getText(); 
                     }
 
                     }
                     break;
                 case 2 :
-                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1658:5: STRING
+                    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1675:5: STRING
                     {
-                    STRING56=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_name4692); if (failed) return name;
+                    STRING57=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_name4907); if (failed) return name;
                     if ( backtracking==0 ) {
-                       name = getString( STRING56.getText() ); 
+                       name = getString( STRING57.getText() ); 
                     }
 
                     }
@@ -7022,16 +7158,16 @@
     };
 
     // $ANTLR start identifier
-    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1661:1: identifier : ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | WHEN | THEN | END | IN );
+    // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1678:1: identifier : ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | EVENT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | WHEN | THEN | END | IN );
     public final identifier_return identifier() throws RecognitionException {
         identifier_return retval = new identifier_return();
         retval.start = input.LT(1);
 
         try {
-            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1662:2: ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | WHEN | THEN | END | IN )
+            // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1679:2: ( ID | PACKAGE | FUNCTION | GLOBAL | IMPORT | EVENT | RULE | QUERY | TEMPLATE | ATTRIBUTES | ENABLED | SALIENCE | DURATION | DIALECT | FROM | INIT | ACTION | REVERSE | RESULT | CONTAINS | EXCLUDES | MEMBEROF | MATCHES | SOUNDSLIKE | WHEN | THEN | END | IN )
             // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:
             {
-            if ( (input.LA(1)>=PACKAGE && input.LA(1)<=ID)||input.LA(1)==GLOBAL||(input.LA(1)>=QUERY && input.LA(1)<=ATTRIBUTES)||input.LA(1)==ENABLED||input.LA(1)==SALIENCE||(input.LA(1)>=DURATION && input.LA(1)<=DIALECT)||input.LA(1)==FROM||(input.LA(1)>=INIT && input.LA(1)<=RESULT)||(input.LA(1)>=CONTAINS && input.LA(1)<=IN)||input.LA(1)==THEN ) {
+            if ( (input.LA(1)>=PACKAGE && input.LA(1)<=ID)||input.LA(1)==GLOBAL||(input.LA(1)>=QUERY && input.LA(1)<=ATTRIBUTES)||input.LA(1)==ENABLED||input.LA(1)==SALIENCE||(input.LA(1)>=DURATION && input.LA(1)<=DIALECT)||input.LA(1)==FROM||(input.LA(1)>=INIT && input.LA(1)<=RESULT)||(input.LA(1)>=CONTAINS && input.LA(1)<=MEMBEROF)||input.LA(1)==IN||input.LA(1)==THEN ) {
                 input.consume();
                 errorRecovery=false;failed=false;
             }
@@ -7060,10 +7196,10 @@
 
     // $ANTLR start synpred1
     public final void synpred1_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:6: ( EXISTS )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:802:8: EXISTS
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:6: ( EXISTS )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:819:8: EXISTS
         {
-        match(input,EXISTS,FOLLOW_EXISTS_in_synpred11913); if (failed) return ;
+        match(input,EXISTS,FOLLOW_EXISTS_in_synpred11972); if (failed) return ;
 
         }
     }
@@ -7071,10 +7207,10 @@
 
     // $ANTLR start synpred2
     public final void synpred2_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:803:5: ( NOT )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:803:7: NOT
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:820:5: ( NOT )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:820:7: NOT
         {
-        match(input,NOT,FOLLOW_NOT_in_synpred21931); if (failed) return ;
+        match(input,NOT,FOLLOW_NOT_in_synpred21990); if (failed) return ;
 
         }
     }
@@ -7082,10 +7218,10 @@
 
     // $ANTLR start synpred3
     public final void synpred3_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:804:5: ( EVAL )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:804:7: EVAL
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:821:5: ( EVAL )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:821:7: EVAL
         {
-        match(input,EVAL,FOLLOW_EVAL_in_synpred31950); if (failed) return ;
+        match(input,EVAL,FOLLOW_EVAL_in_synpred32009); if (failed) return ;
 
         }
     }
@@ -7093,10 +7229,10 @@
 
     // $ANTLR start synpred4
     public final void synpred4_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:805:5: ( FORALL )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:805:7: FORALL
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:822:5: ( FORALL )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:822:7: FORALL
         {
-        match(input,FORALL,FOLLOW_FORALL_in_synpred41969); if (failed) return ;
+        match(input,FORALL,FOLLOW_FORALL_in_synpred42028); if (failed) return ;
 
         }
     }
@@ -7104,10 +7240,10 @@
 
     // $ANTLR start synpred5
     public final void synpred5_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:806:5: ( LEFT_PAREN )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:806:7: LEFT_PAREN
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:823:5: ( LEFT_PAREN )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:823:7: LEFT_PAREN
         {
-        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred51988); if (failed) return ;
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred52047); if (failed) return ;
 
         }
     }
@@ -7115,10 +7251,10 @@
 
     // $ANTLR start synpred6
     public final void synpred6_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1093:6: ( LEFT_SQUARE )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1093:8: LEFT_SQUARE
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:6: ( LEFT_SQUARE )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1110:8: LEFT_SQUARE
         {
-        match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_synpred62958); if (failed) return ;
+        match(input,LEFT_SQUARE,FOLLOW_LEFT_SQUARE_in_synpred63017); if (failed) return ;
 
         }
     }
@@ -7126,10 +7262,10 @@
 
     // $ANTLR start synpred7
     public final void synpred7_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1099:6: ( LEFT_PAREN )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1099:8: LEFT_PAREN
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1116:6: ( LEFT_PAREN )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1116:8: LEFT_PAREN
         {
-        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred72991); if (failed) return ;
+        match(input,LEFT_PAREN,FOLLOW_LEFT_PAREN_in_synpred73050); if (failed) return ;
 
         }
     }
@@ -7137,11 +7273,11 @@
 
     // $ANTLR start synpred8
     public final void synpred8_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1400:6: ( DOUBLE_PIPE and_restr_connective[or] )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1400:6: DOUBLE_PIPE and_restr_connective[or]
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1413:6: ( DOUBLE_PIPE and_restr_connective[or] )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1413:6: DOUBLE_PIPE and_restr_connective[or]
         {
-        match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_synpred83723); if (failed) return ;
-        pushFollow(FOLLOW_and_restr_connective_in_synpred83734);
+        match(input,DOUBLE_PIPE,FOLLOW_DOUBLE_PIPE_in_synpred83745); if (failed) return ;
+        pushFollow(FOLLOW_and_restr_connective_in_synpred83756);
         and_restr_connective(or);
         _fsp--;
         if (failed) return ;
@@ -7152,11 +7288,11 @@
 
     // $ANTLR start synpred9
     public final void synpred9_fragment() throws RecognitionException {   
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1422:5: ( DOUBLE_AMPER constraint_expression[and] )
-        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1422:5: DOUBLE_AMPER constraint_expression[and]
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1435:5: ( DOUBLE_AMPER constraint_expression[and] )
+        // /home/etirelli/workspace/jboss/jbossrules/drools-compiler/src/main/resources/org/drools/lang/DRL.g:1435:5: DOUBLE_AMPER constraint_expression[and]
         {
-        match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_synpred93787); if (failed) return ;
-        pushFollow(FOLLOW_constraint_expression_in_synpred93798);
+        match(input,DOUBLE_AMPER,FOLLOW_DOUBLE_AMPER_in_synpred93808); if (failed) return ;
+        pushFollow(FOLLOW_constraint_expression_in_synpred93819);
         constraint_expression(and);
         _fsp--;
         if (failed) return ;
@@ -7304,24 +7440,26 @@
     static final String DFA8_eofS =
         "\6\uffff";
     static final String DFA8_minS =
-        "\2\4\1\uffff\1\74\1\uffff\1\4";
+        "\2\4\1\uffff\1\76\1\uffff\1\4";
     static final String DFA8_maxS =
-        "\2\75\1\uffff\1\74\1\uffff\1\75";
+        "\2\77\1\uffff\1\76\1\uffff\1\77";
     static final String DFA8_acceptS =
         "\2\uffff\1\1\1\uffff\1\2\1\uffff";
     static final String DFA8_specialS =
         "\6\uffff}>";
     static final String[] DFA8_transitionS = {
-            "\4\1\1\uffff\1\1\3\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
-            "\2\1\5\uffff\1\1\5\uffff\4\1\1\uffff\6\1\6\uffff\1\1",
-            "\6\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff\2\2\5\uffff"+
-            "\1\2\5\uffff\4\2\1\uffff\6\2\4\uffff\1\3\1\uffff\1\2",
+            "\5\1\1\uffff\1\1\3\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
+            "\2\1\5\uffff\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\1\1\6\uffff"+
+            "\1\1",
+            "\7\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff\2\2\5\uffff"+
+            "\1\2\5\uffff\4\2\1\uffff\5\2\1\uffff\1\2\4\uffff\1\3\1\uffff"+
+            "\1\2",
             "",
             "\1\5",
             "",
-            "\4\2\1\uffff\1\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff"+
-            "\2\2\5\uffff\1\2\5\uffff\4\2\1\uffff\6\2\4\uffff\1\3\1\uffff"+
-            "\1\2"
+            "\5\2\1\uffff\1\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff"+
+            "\2\2\5\uffff\1\2\5\uffff\4\2\1\uffff\5\2\1\uffff\1\2\4\uffff"+
+            "\1\3\1\uffff\1\2"
     };
 
     static final short[] DFA8_eot = DFA.unpackEncodedString(DFA8_eotS);
@@ -7354,7 +7492,7 @@
             this.transition = DFA8_transition;
         }
         public String getDescription() {
-            return "344:15: (paramType= dotted_name )?";
+            return "361:15: (paramType= dotted_name )?";
         }
     }
     static final String DFA9_eotS =
@@ -7362,24 +7500,26 @@
     static final String DFA9_eofS =
         "\6\uffff";
     static final String DFA9_minS =
-        "\2\4\1\uffff\1\74\1\uffff\1\4";
+        "\2\4\1\76\2\uffff\1\4";
     static final String DFA9_maxS =
-        "\2\75\1\uffff\1\74\1\uffff\1\75";
+        "\2\77\1\76\2\uffff\1\77";
     static final String DFA9_acceptS =
-        "\2\uffff\1\1\1\uffff\1\2\1\uffff";
+        "\3\uffff\1\2\1\1\1\uffff";
     static final String DFA9_specialS =
         "\6\uffff}>";
     static final String[] DFA9_transitionS = {
-            "\4\1\1\uffff\1\1\3\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
-            "\2\1\5\uffff\1\1\5\uffff\4\1\1\uffff\6\1\6\uffff\1\1",
-            "\6\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff\2\2\5\uffff"+
-            "\1\2\5\uffff\4\2\1\uffff\6\2\4\uffff\1\3\1\uffff\1\2",
-            "",
+            "\5\1\1\uffff\1\1\3\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
+            "\2\1\5\uffff\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\1\1\6\uffff"+
+            "\1\1",
+            "\7\4\1\uffff\2\3\6\4\3\uffff\1\4\1\uffff\1\4\6\uffff\2\4\5\uffff"+
+            "\1\4\5\uffff\4\4\1\uffff\5\4\1\uffff\1\4\4\uffff\1\2\1\uffff"+
+            "\1\4",
             "\1\5",
             "",
-            "\4\2\1\uffff\1\2\1\uffff\2\4\6\2\3\uffff\1\2\1\uffff\1\2\6\uffff"+
-            "\2\2\5\uffff\1\2\5\uffff\4\2\1\uffff\6\2\4\uffff\1\3\1\uffff"+
-            "\1\2"
+            "",
+            "\5\4\1\uffff\1\4\1\uffff\2\3\6\4\3\uffff\1\4\1\uffff\1\4\6\uffff"+
+            "\2\4\5\uffff\1\4\5\uffff\4\4\1\uffff\5\4\1\uffff\1\4\4\uffff"+
+            "\1\2\1\uffff\1\4"
     };
 
     static final short[] DFA9_eot = DFA.unpackEncodedString(DFA9_eotS);
@@ -7412,7 +7552,7 @@
             this.transition = DFA9_transition;
         }
         public String getDescription() {
-            return "349:22: (paramType= dotted_name )?";
+            return "366:22: (paramType= dotted_name )?";
         }
     }
     static final String DFA17_eotS =
@@ -7420,9 +7560,9 @@
     static final String DFA17_eofS =
         "\11\uffff";
     static final String DFA17_minS =
-        "\2\7\1\uffff\1\7\1\uffff\1\4\1\74\2\7";
+        "\2\10\1\uffff\1\10\1\uffff\1\4\1\76\2\10";
     static final String DFA17_maxS =
-        "\2\52\1\uffff\1\112\1\uffff\1\75\1\74\2\73";
+        "\2\53\1\uffff\1\114\1\uffff\1\77\1\76\2\75";
     static final String DFA17_acceptS =
         "\2\uffff\1\2\1\uffff\1\1\4\uffff";
     static final String DFA17_specialS =
@@ -7432,13 +7572,14 @@
             "\1\3\2\uffff\1\2\1\uffff\1\4\25\uffff\1\2\1\uffff\1\2\2\uffff"+
             "\4\2",
             "",
-            "\1\4\1\5\1\uffff\1\2\2\4\56\uffff\1\6\16\uffff\1\2",
+            "\1\4\1\5\1\uffff\1\2\2\4\57\uffff\1\6\16\uffff\1\2",
             "",
-            "\4\7\1\uffff\1\7\3\uffff\6\7\3\uffff\1\7\1\uffff\1\7\6\uffff"+
-            "\2\7\5\uffff\1\7\5\uffff\4\7\1\uffff\6\7\6\uffff\1\7",
+            "\5\7\1\uffff\1\7\3\uffff\6\7\3\uffff\1\7\1\uffff\1\7\6\uffff"+
+            "\2\7\5\uffff\1\7\5\uffff\4\7\1\uffff\5\7\1\uffff\1\7\6\uffff"+
+            "\1\7",
             "\1\10",
-            "\1\4\1\5\1\uffff\1\2\60\uffff\1\6",
-            "\1\4\2\uffff\1\2\60\uffff\1\6"
+            "\1\4\1\5\1\uffff\1\2\61\uffff\1\6",
+            "\1\4\2\uffff\1\2\61\uffff\1\6"
     };
 
     static final short[] DFA17_eot = DFA.unpackEncodedString(DFA17_eotS);
@@ -7471,7 +7612,7 @@
             this.transition = DFA17_transition;
         }
         public String getDescription() {
-            return "393:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?";
+            return "410:3: ( LEFT_PAREN ( ( (paramType= qualified_id )? paramName= ID ) ( COMMA (paramType= qualified_id )? paramName= ID )* )? RIGHT_PAREN )?";
         }
     }
     static final String DFA52_eotS =
@@ -7479,101 +7620,106 @@
     static final String DFA52_eofS =
         "\150\uffff";
     static final String DFA52_minS =
-        "\1\7\1\uffff\1\4\1\uffff\3\4\1\0\1\uffff\4\4\1\uffff\4\4\1\0\1\4"+
-        "\1\0\5\4\1\0\1\4\1\0\1\4\2\0\3\4\1\0\1\4\2\0\1\4\2\0\3\4\1\0\1\4"+
-        "\1\0\1\4\3\0\3\4\1\0\3\4\1\0\3\4\1\0\1\4\1\0\1\4\1\uffff\44\0";
+        "\1\10\1\uffff\1\4\1\uffff\3\4\1\0\1\uffff\4\4\1\uffff\4\4\1\0\2"+
+        "\4\1\0\4\4\1\0\1\4\1\0\1\4\2\0\3\4\2\0\2\4\3\0\3\4\2\0\2\4\3\0\3"+
+        "\4\1\0\3\4\1\0\3\4\1\0\1\4\1\0\1\4\1\uffff\44\0";
     static final String DFA52_maxS =
-        "\1\110\1\uffff\1\121\1\uffff\3\121\1\0\1\uffff\4\121\1\uffff\4\121"+
-        "\1\0\1\121\1\0\5\121\1\0\1\121\1\0\1\121\2\0\3\121\1\0\1\121\2\0"+
-        "\1\121\2\0\3\121\1\0\1\121\1\0\1\121\3\0\3\121\1\0\3\121\1\0\3\121"+
-        "\1\0\1\121\1\0\1\121\1\uffff\44\0";
+        "\1\112\1\uffff\1\123\1\uffff\3\123\1\0\1\uffff\4\123\1\uffff\4\123"+
+        "\1\0\2\123\1\0\4\123\1\0\1\123\1\0\1\123\2\0\3\123\2\0\2\123\3\0"+
+        "\3\123\2\0\2\123\3\0\3\123\1\0\3\123\1\0\3\123\1\0\1\123\1\0\1\123"+
+        "\1\uffff\44\0";
     static final String DFA52_acceptS =
         "\1\uffff\1\1\1\uffff\1\3\4\uffff\1\2\4\uffff\1\2\65\uffff\1\2\44"+
         "\uffff";
     static final String DFA52_specialS =
-        "\1\34\1\uffff\1\62\1\uffff\1\22\1\41\1\10\1\60\1\uffff\1\14\1\20"+
-        "\1\64\1\31\1\uffff\1\35\1\72\1\65\1\54\1\61\1\47\1\0\1\12\1\33\1"+
-        "\24\1\74\1\17\1\66\1\30\1\56\1\27\1\76\1\73\1\5\1\42\1\51\1\2\1"+
-        "\46\1\37\1\67\1\45\1\75\1\36\1\1\1\26\1\4\1\57\1\16\1\63\1\15\1"+
-        "\11\1\55\1\70\1\21\1\71\1\50\1\13\1\6\1\43\1\52\1\3\1\7\1\44\1\53"+
-        "\1\23\1\40\1\25\1\32\45\uffff}>";
+        "\1\13\1\uffff\1\55\1\uffff\1\66\1\30\1\21\1\74\1\uffff\1\54\1\56"+
+        "\1\65\1\34\1\uffff\1\70\1\5\1\76\1\63\1\35\1\53\1\62\1\6\1\72\1"+
+        "\61\1\17\1\16\1\64\1\33\1\10\1\32\1\12\1\11\1\25\1\22\1\41\1\44"+
+        "\1\31\1\52\1\51\1\20\1\50\1\37\1\73\1\36\1\40\1\1\1\47\1\15\1\14"+
+        "\1\67\1\4\1\60\1\57\1\75\1\0\1\7\1\26\1\23\1\42\1\71\1\27\1\24\1"+
+        "\43\1\45\1\2\1\46\1\3\45\uffff}>";
     static final String[] DFA52_transitionS = {
             "\2\3\1\uffff\1\2\2\3\1\uffff\1\3\23\uffff\4\3\1\uffff\4\3\1"+
-            "\uffff\1\3\16\uffff\1\1\1\uffff\1\3\12\uffff\1\3",
+            "\uffff\1\3\17\uffff\1\1\1\uffff\1\3\12\uffff\1\3",
             "",
-            "\3\15\1\14\2\15\1\7\1\15\1\10\25\15\1\5\1\15\1\4\2\15\1\6\1"+
-            "\11\1\12\1\13\47\15",
+            "\4\15\1\14\2\15\1\7\1\15\1\10\25\15\1\5\1\15\1\4\2\15\1\6\1"+
+            "\11\1\12\1\13\50\15",
             "",
-            "\3\15\1\23\2\15\1\22\1\15\1\10\32\15\1\16\1\17\1\20\1\21\47"+
+            "\4\15\1\23\2\15\1\22\1\15\1\10\32\15\1\16\1\17\1\20\1\21\50"+
             "\15",
-            "\3\15\1\31\2\15\1\24\1\15\1\10\32\15\1\25\1\26\1\27\1\30\47"+
+            "\4\15\1\31\2\15\1\25\1\15\1\10\32\15\1\24\1\26\1\27\1\30\50"+
             "\15",
-            "\3\15\1\33\2\15\1\32\1\15\1\10\105\15",
+            "\4\15\1\33\2\15\1\32\1\15\1\10\106\15",
             "\1\uffff",
             "",
-            "\3\15\1\35\2\15\1\34\1\15\1\10\105\15",
-            "\6\15\1\36\1\15\1\10\105\15",
-            "\6\15\1\37\1\15\1\10\105\15",
-            "\4\15\1\41\1\15\1\43\1\15\1\10\56\15\1\42\16\15\1\40\7\15",
+            "\4\15\1\35\2\15\1\34\1\15\1\10\106\15",
+            "\7\15\1\36\1\15\1\10\106\15",
+            "\7\15\1\37\1\15\1\10\106\15",
+            "\5\15\1\41\1\15\1\43\1\15\1\10\57\15\1\42\16\15\1\40\7\15",
             "",
-            "\3\15\1\44\2\15\1\45\1\15\1\10\105\15",
-            "\3\15\1\47\2\15\1\46\1\15\1\10\105\15",
-            "\6\15\1\50\1\15\1\10\105\15",
-            "\6\15\1\51\1\15\1\10\105\15",
+            "\4\15\1\45\2\15\1\44\1\15\1\10\106\15",
+            "\4\15\1\46\2\15\1\47\1\15\1\10\106\15",
+            "\7\15\1\50\1\15\1\10\106\15",
+            "\7\15\1\51\1\15\1\10\106\15",
             "\1\uffff",
-            "\4\15\1\53\1\15\1\55\1\15\1\10\56\15\1\54\16\15\1\52\7\15",
+            "\5\15\1\53\1\15\1\55\1\15\1\10\57\15\1\54\16\15\1\52\7\15",
+            "\4\15\1\57\2\15\1\56\1\15\1\10\106\15",
             "\1\uffff",
-            "\3\15\1\56\2\15\1\57\1\15\1\10\105\15",
-            "\3\15\1\60\2\15\1\61\1\15\1\10\105\15",
-            "\6\15\1\62\1\15\1\10\105\15",
-            "\6\15\1\63\1\15\1\10\105\15",
-            "\4\15\1\65\1\15\1\67\1\15\1\10\56\15\1\66\16\15\1\64\7\15",
+            "\4\15\1\60\2\15\1\61\1\15\1\10\106\15",
+            "\7\15\1\62\1\15\1\10\106\15",
+            "\7\15\1\63\1\15\1\10\106\15",
+            "\5\15\1\65\1\15\1\67\1\15\1\10\57\15\1\66\16\15\1\64\7\15",
             "\1\uffff",
-            "\4\15\1\71\1\15\1\73\1\15\1\10\56\15\1\72\16\15\1\70\7\15",
+            "\5\15\1\71\1\15\1\73\1\15\1\10\57\15\1\72\16\15\1\70\7\15",
             "\1\uffff",
-            "\4\15\1\75\1\15\1\77\1\15\1\10\56\15\1\76\16\15\1\74\7\15",
+            "\5\15\1\75\1\15\1\77\1\15\1\10\57\15\1\76\16\15\1\74\7\15",
             "\1\uffff",
             "\1\uffff",
-            "\3\15\1\100\2\15\1\101\1\15\1\10\105\15",
-            "\4\102\1\15\1\102\1\103\1\15\1\10\6\102\3\15\1\102\1\15\1\102"+
-            "\6\15\2\102\5\15\1\102\5\15\4\102\1\15\6\102\6\15\1\102\24\15",
-            "\6\15\1\103\1\15\1\10\57\15\1\104\25\15",
+            "\4\15\1\100\2\15\1\101\1\15\1\10\106\15",
+            "\5\102\1\15\1\102\1\103\1\15\1\10\6\102\3\15\1\102\1\15\1\102"+
+            "\6\15\2\102\5\15\1\102\5\15\4\102\1\15\5\102\1\15\1\102\6\15"+
+            "\1\102\24\15",
+            "\7\15\1\103\1\15\1\10\60\15\1\104\25\15",
             "\1\uffff",
-            "\4\15\1\106\1\15\1\110\1\15\1\10\56\15\1\107\16\15\1\105\7\15",
             "\1\uffff",
+            "\5\15\1\106\1\15\1\110\1\15\1\10\57\15\1\107\16\15\1\105\7\15",
+            "\5\15\1\112\1\15\1\114\1\15\1\10\57\15\1\113\16\15\1\111\7\15",
             "\1\uffff",
-            "\4\15\1\112\1\15\1\114\1\15\1\10\56\15\1\113\16\15\1\111\7\15",
             "\1\uffff",
             "\1\uffff",
-            "\3\15\1\115\2\15\1\116\1\15\1\10\105\15",
-            "\4\117\1\15\1\117\1\103\1\15\1\10\6\117\3\15\1\117\1\15\1\117"+
-            "\6\15\2\117\5\15\1\117\5\15\4\117\1\15\6\117\6\15\1\117\24\15",
-            "\6\15\1\103\1\15\1\10\57\15\1\120\25\15",
+            "\4\15\1\115\2\15\1\116\1\15\1\10\106\15",
+            "\5\117\1\15\1\117\1\103\1\15\1\10\6\117\3\15\1\117\1\15\1\117"+
+            "\6\15\2\117\5\15\1\117\5\15\4\117\1\15\5\117\1\15\1\117\6\15"+
+            "\1\117\24\15",
+            "\7\15\1\103\1\15\1\10\60\15\1\120\25\15",
             "\1\uffff",
-            "\4\15\1\122\1\15\1\124\1\15\1\10\56\15\1\123\16\15\1\121\7\15",
             "\1\uffff",
-            "\4\15\1\126\1\15\1\130\1\15\1\10\56\15\1\127\16\15\1\125\7\15",
+            "\5\15\1\122\1\15\1\123\1\15\1\10\57\15\1\124\16\15\1\121\7\15",
+            "\5\15\1\126\1\15\1\130\1\15\1\10\57\15\1\127\16\15\1\125\7\15",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
-            "\3\15\1\131\2\15\1\132\1\15\1\10\105\15",
-            "\4\133\1\15\1\133\1\103\1\15\1\10\6\133\3\15\1\133\1\15\1\133"+
-            "\6\15\2\133\5\15\1\133\5\15\4\133\1\15\6\133\6\15\1\133\24\15",
-            "\6\15\1\103\1\15\1\10\57\15\1\134\25\15",
+            "\4\15\1\131\2\15\1\132\1\15\1\10\106\15",
+            "\5\133\1\15\1\133\1\103\1\15\1\10\6\133\3\15\1\133\1\15\1\133"+
+            "\6\15\2\133\5\15\1\133\5\15\4\133\1\15\5\133\1\15\1\133\6\15"+
+            "\1\133\24\15",
+            "\7\15\1\103\1\15\1\10\60\15\1\134\25\15",
             "\1\uffff",
-            "\3\15\1\135\2\15\1\136\1\15\1\10\105\15",
-            "\4\137\1\15\1\137\1\103\1\15\1\10\6\137\3\15\1\137\1\15\1\137"+
-            "\6\15\2\137\5\15\1\137\5\15\4\137\1\15\6\137\6\15\1\137\24\15",
-            "\6\15\1\103\1\15\1\10\57\15\1\140\25\15",
+            "\4\15\1\135\2\15\1\136\1\15\1\10\106\15",
+            "\5\137\1\15\1\137\1\103\1\15\1\10\6\137\3\15\1\137\1\15\1\137"+
+            "\6\15\2\137\5\15\1\137\5\15\4\137\1\15\5\137\1\15\1\137\6\15"+
+            "\1\137\24\15",
+            "\7\15\1\103\1\15\1\10\60\15\1\140\25\15",
             "\1\uffff",
-            "\3\15\1\141\2\15\1\142\1\15\1\10\105\15",
-            "\4\143\1\15\1\143\1\103\1\15\1\10\6\143\3\15\1\143\1\15\1\143"+
-            "\6\15\2\143\5\15\1\143\5\15\4\143\1\15\6\143\6\15\1\143\24\15",
-            "\6\15\1\103\1\15\1\10\57\15\1\144\25\15",
+            "\4\15\1\141\2\15\1\142\1\15\1\10\106\15",
+            "\5\143\1\15\1\143\1\103\1\15\1\10\6\143\3\15\1\143\1\15\1\143"+
+            "\6\15\2\143\5\15\1\143\5\15\4\143\1\15\5\143\1\15\1\143\6\15"+
+            "\1\143\24\15",
+            "\7\15\1\103\1\15\1\10\60\15\1\144\25\15",
             "\1\uffff",
-            "\4\15\1\145\1\15\1\147\1\15\1\10\56\15\1\146\26\15",
+            "\5\15\1\145\1\15\1\147\1\15\1\10\57\15\1\146\26\15",
             "\1\uffff",
-            "\4\15\1\41\1\15\1\43\1\15\1\10\56\15\1\42\26\15",
+            "\5\15\1\41\1\15\1\43\1\15\1\10\57\15\1\42\26\15",
             "",
             "\1\uffff",
             "\1\uffff",
@@ -7643,246 +7789,221 @@
             this.transition = DFA52_transition;
         }
         public String getDescription() {
-            return "1092:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?";
+            return "1109:4: ( ( LEFT_SQUARE )=>sqarg= square_chunk | ( LEFT_PAREN )=>paarg= paren_chunk )?";
         }
         public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA52_20 = input.LA(1);
+                        int LA52_54 = input.LA(1);
 
                          
-                        int index52_20 = input.index();
+                        int index52_54 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (LA52_54==RIGHT_SQUARE) ) {s = 92;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_54==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( ((LA52_54>=PACKAGE && LA52_54<=GLOBAL)||LA52_54==COMMA||(LA52_54>=QUERY && LA52_54<=LEFT_SQUARE)||(LA52_54>=THEN && LA52_54<=83)) && (synpred7())) {s = 13;}
+
+                        else if ( (LA52_54==LEFT_PAREN) && (synpred7())) {s = 67;}
+
                          
-                        input.seek(index52_20);
+                        input.seek(index52_54);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA52_42 = input.LA(1);
+                        int LA52_45 = input.LA(1);
 
                          
-                        int index52_42 = input.index();
+                        int index52_45 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_42==ID) ) {s = 77;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_42==LEFT_PAREN) ) {s = 78;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_42==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_42>=PACKAGE && LA52_42<=FUNCTION)||(LA52_42>=DOT && LA52_42<=GLOBAL)||LA52_42==COMMA||(LA52_42>=QUERY && LA52_42<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_42);
+                        input.seek(index52_45);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA52_35 = input.LA(1);
+                        int LA52_64 = input.LA(1);
 
                          
-                        int index52_35 = input.index();
+                        int index52_64 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_64==DOT) ) {s = 101;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_64==LEFT_SQUARE) ) {s = 102;}
 
+                        else if ( (LA52_64==LEFT_PAREN) ) {s = 103;}
+
+                        else if ( (LA52_64==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_64>=PACKAGE && LA52_64<=ID)||LA52_64==GLOBAL||LA52_64==COMMA||(LA52_64>=QUERY && LA52_64<=RIGHT_CURLY)||(LA52_64>=RIGHT_SQUARE && LA52_64<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_35);
+                        input.seek(index52_64);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA52_59 = input.LA(1);
+                        int LA52_66 = input.LA(1);
 
                          
-                        int index52_59 = input.index();
+                        int index52_66 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_66==LEFT_SQUARE) ) {s = 34;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_66==LEFT_PAREN) ) {s = 35;}
 
+                        else if ( (LA52_66==DOT) ) {s = 33;}
+
+                        else if ( (LA52_66==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_66>=PACKAGE && LA52_66<=ID)||LA52_66==GLOBAL||LA52_66==COMMA||(LA52_66>=QUERY && LA52_66<=RIGHT_CURLY)||(LA52_66>=RIGHT_SQUARE && LA52_66<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_59);
+                        input.seek(index52_66);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA52_44 = input.LA(1);
+                        int LA52_50 = input.LA(1);
 
                          
-                        int index52_44 = input.index();
+                        int index52_50 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_44==RIGHT_SQUARE) ) {s = 80;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_44==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( ((LA52_44>=PACKAGE && LA52_44<=GLOBAL)||LA52_44==COMMA||(LA52_44>=QUERY && LA52_44<=LEFT_SQUARE)||(LA52_44>=THEN && LA52_44<=81)) && (synpred7())) {s = 13;}
-
-                        else if ( (LA52_44==LEFT_PAREN) && (synpred7())) {s = 67;}
-
                          
-                        input.seek(index52_44);
+                        input.seek(index52_50);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA52_32 = input.LA(1);
+                        int LA52_15 = input.LA(1);
 
                          
-                        int index52_32 = input.index();
+                        int index52_15 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_32==ID) ) {s = 64;}
+                        if ( (LA52_15==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_32==LEFT_PAREN) ) {s = 65;}
+                        else if ( (LA52_15==ID) ) {s = 38;}
 
-                        else if ( (LA52_32==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_15==LEFT_PAREN) ) {s = 39;}
 
-                        else if ( ((LA52_32>=PACKAGE && LA52_32<=FUNCTION)||(LA52_32>=DOT && LA52_32<=GLOBAL)||LA52_32==COMMA||(LA52_32>=QUERY && LA52_32<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_15>=PACKAGE && LA52_15<=EVENT)||(LA52_15>=DOT && LA52_15<=GLOBAL)||LA52_15==COMMA||(LA52_15>=QUERY && LA52_15<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_32);
+                        input.seek(index52_15);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA52_56 = input.LA(1);
+                        int LA52_21 = input.LA(1);
 
                          
-                        int index52_56 = input.index();
+                        int index52_21 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_56==ID) ) {s = 93;}
+                        if ( (synpred7()) ) {s = 13;}
 
-                        else if ( (LA52_56==LEFT_PAREN) ) {s = 94;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_56==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_56>=PACKAGE && LA52_56<=FUNCTION)||(LA52_56>=DOT && LA52_56<=GLOBAL)||LA52_56==COMMA||(LA52_56>=QUERY && LA52_56<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_56);
+                        input.seek(index52_21);
                         if ( s>=0 ) return s;
                         break;
                     case 7 : 
-                        int LA52_60 = input.LA(1);
+                        int LA52_55 = input.LA(1);
 
                          
-                        int index52_60 = input.index();
+                        int index52_55 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_60==ID) ) {s = 97;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_60==LEFT_PAREN) ) {s = 98;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_60==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_60>=PACKAGE && LA52_60<=FUNCTION)||(LA52_60>=DOT && LA52_60<=GLOBAL)||LA52_60==COMMA||(LA52_60>=QUERY && LA52_60<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_60);
+                        input.seek(index52_55);
                         if ( s>=0 ) return s;
                         break;
                     case 8 : 
-                        int LA52_6 = input.LA(1);
+                        int LA52_28 = input.LA(1);
 
                          
-                        int index52_6 = input.index();
+                        int index52_28 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_6==LEFT_PAREN) ) {s = 26;}
+                        if ( (synpred7()) ) {s = 13;}
 
-                        else if ( (LA52_6==ID) ) {s = 27;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_6==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_6>=PACKAGE && LA52_6<=FUNCTION)||(LA52_6>=DOT && LA52_6<=GLOBAL)||LA52_6==COMMA||(LA52_6>=QUERY && LA52_6<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_6);
+                        input.seek(index52_28);
                         if ( s>=0 ) return s;
                         break;
                     case 9 : 
-                        int LA52_49 = input.LA(1);
+                        int LA52_31 = input.LA(1);
 
                          
-                        int index52_49 = input.index();
+                        int index52_31 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (synpred7()) ) {s = 13;}
 
                         else if ( (true) ) {s = 3;}
 
                          
-                        input.seek(index52_49);
+                        input.seek(index52_31);
                         if ( s>=0 ) return s;
                         break;
                     case 10 : 
-                        int LA52_21 = input.LA(1);
+                        int LA52_30 = input.LA(1);
 
                          
-                        int index52_21 = input.index();
+                        int index52_30 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_21==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        if ( (synpred7()) ) {s = 13;}
 
-                        else if ( (LA52_21==ID) ) {s = 46;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_21==LEFT_PAREN) ) {s = 47;}
-
-                        else if ( ((LA52_21>=PACKAGE && LA52_21<=FUNCTION)||(LA52_21>=DOT && LA52_21<=GLOBAL)||LA52_21==COMMA||(LA52_21>=QUERY && LA52_21<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_21);
+                        input.seek(index52_30);
                         if ( s>=0 ) return s;
                         break;
                     case 11 : 
-                        int LA52_55 = input.LA(1);
+                        int LA52_0 = input.LA(1);
 
                          
-                        int index52_55 = input.index();
+                        int index52_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_0==LEFT_SQUARE) && (synpred6())) {s = 1;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_0==LEFT_PAREN) ) {s = 2;}
 
+                        else if ( ((LA52_0>=ID && LA52_0<=DOT)||(LA52_0>=COMMA && LA52_0<=RIGHT_PAREN)||LA52_0==END||(LA52_0>=OR && LA52_0<=DOUBLE_AMPER)||(LA52_0>=EXISTS && LA52_0<=FORALL)||LA52_0==INIT||LA52_0==THEN||LA52_0==74) ) {s = 3;}
+
                          
-                        input.seek(index52_55);
+                        input.seek(index52_0);
                         if ( s>=0 ) return s;
                         break;
                     case 12 : 
-                        int LA52_9 = input.LA(1);
-
-                         
-                        int index52_9 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (LA52_9==LEFT_PAREN) ) {s = 28;}
-
-                        else if ( (LA52_9==ID) ) {s = 29;}
-
-                        else if ( (LA52_9==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_9>=PACKAGE && LA52_9<=FUNCTION)||(LA52_9>=DOT && LA52_9<=GLOBAL)||LA52_9==COMMA||(LA52_9>=QUERY && LA52_9<=81)) && (synpred7())) {s = 13;}
-
-                         
-                        input.seek(index52_9);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 13 : 
                         int LA52_48 = input.LA(1);
 
                          
                         int index52_48 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_48==74) ) {s = 85;}
+                        if ( (LA52_48==76) ) {s = 85;}
 
                         else if ( (LA52_48==DOT) ) {s = 86;}
 
@@ -7892,43 +8013,43 @@
 
                         else if ( (LA52_48==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( ((LA52_48>=PACKAGE && LA52_48<=ID)||LA52_48==GLOBAL||LA52_48==COMMA||(LA52_48>=QUERY && LA52_48<=RIGHT_CURLY)||(LA52_48>=RIGHT_SQUARE && LA52_48<=73)||(LA52_48>=75 && LA52_48<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_48>=PACKAGE && LA52_48<=ID)||LA52_48==GLOBAL||LA52_48==COMMA||(LA52_48>=QUERY && LA52_48<=RIGHT_CURLY)||(LA52_48>=RIGHT_SQUARE && LA52_48<=75)||(LA52_48>=77 && LA52_48<=83)) && (synpred7())) {s = 13;}
 
                          
                         input.seek(index52_48);
                         if ( s>=0 ) return s;
                         break;
-                    case 14 : 
-                        int LA52_46 = input.LA(1);
+                    case 13 : 
+                        int LA52_47 = input.LA(1);
 
                          
-                        int index52_46 = input.index();
+                        int index52_47 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_46==74) ) {s = 81;}
+                        if ( (LA52_47==76) ) {s = 81;}
 
-                        else if ( (LA52_46==DOT) ) {s = 82;}
+                        else if ( (LA52_47==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_46==LEFT_SQUARE) ) {s = 83;}
+                        else if ( (LA52_47==DOT) ) {s = 82;}
 
-                        else if ( (LA52_46==LEFT_PAREN) ) {s = 84;}
+                        else if ( (LA52_47==LEFT_PAREN) ) {s = 83;}
 
-                        else if ( (LA52_46==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_47==LEFT_SQUARE) ) {s = 84;}
 
-                        else if ( ((LA52_46>=PACKAGE && LA52_46<=ID)||LA52_46==GLOBAL||LA52_46==COMMA||(LA52_46>=QUERY && LA52_46<=RIGHT_CURLY)||(LA52_46>=RIGHT_SQUARE && LA52_46<=73)||(LA52_46>=75 && LA52_46<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_47>=PACKAGE && LA52_47<=ID)||LA52_47==GLOBAL||LA52_47==COMMA||(LA52_47>=QUERY && LA52_47<=RIGHT_CURLY)||(LA52_47>=RIGHT_SQUARE && LA52_47<=75)||(LA52_47>=77 && LA52_47<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_46);
+                        input.seek(index52_47);
                         if ( s>=0 ) return s;
                         break;
-                    case 15 : 
+                    case 14 : 
                         int LA52_25 = input.LA(1);
 
                          
                         int index52_25 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_25==74) ) {s = 52;}
+                        if ( (LA52_25==76) ) {s = 52;}
 
                         else if ( (LA52_25==DOT) ) {s = 53;}
 
@@ -7938,306 +8059,327 @@
 
                         else if ( (LA52_25==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( ((LA52_25>=PACKAGE && LA52_25<=ID)||LA52_25==GLOBAL||LA52_25==COMMA||(LA52_25>=QUERY && LA52_25<=RIGHT_CURLY)||(LA52_25>=RIGHT_SQUARE && LA52_25<=73)||(LA52_25>=75 && LA52_25<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_25>=PACKAGE && LA52_25<=ID)||LA52_25==GLOBAL||LA52_25==COMMA||(LA52_25>=QUERY && LA52_25<=RIGHT_CURLY)||(LA52_25>=RIGHT_SQUARE && LA52_25<=75)||(LA52_25>=77 && LA52_25<=83)) && (synpred7())) {s = 13;}
 
                          
                         input.seek(index52_25);
                         if ( s>=0 ) return s;
                         break;
-                    case 16 : 
-                        int LA52_10 = input.LA(1);
+                    case 15 : 
+                        int LA52_24 = input.LA(1);
 
                          
-                        int index52_10 = input.index();
+                        int index52_24 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_10==LEFT_PAREN) ) {s = 30;}
+                        if ( (LA52_24==LEFT_PAREN) ) {s = 51;}
 
-                        else if ( (LA52_10==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_24==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( ((LA52_10>=PACKAGE && LA52_10<=GLOBAL)||LA52_10==COMMA||(LA52_10>=QUERY && LA52_10<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_24>=PACKAGE && LA52_24<=GLOBAL)||LA52_24==COMMA||(LA52_24>=QUERY && LA52_24<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_10);
+                        input.seek(index52_24);
                         if ( s>=0 ) return s;
                         break;
+                    case 16 : 
+                        int LA52_39 = input.LA(1);
+
+                         
+                        int index52_39 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred7()) ) {s = 67;}
+
+                        else if ( (true) ) {s = 3;}
+
+                         
+                        input.seek(index52_39);
+                        if ( s>=0 ) return s;
+                        break;
                     case 17 : 
-                        int LA52_52 = input.LA(1);
+                        int LA52_6 = input.LA(1);
 
                          
-                        int index52_52 = input.index();
+                        int index52_6 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_52==ID) ) {s = 89;}
+                        if ( (LA52_6==LEFT_PAREN) ) {s = 26;}
 
-                        else if ( (LA52_52==LEFT_PAREN) ) {s = 90;}
+                        else if ( (LA52_6==ID) ) {s = 27;}
 
-                        else if ( (LA52_52==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_6==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( ((LA52_52>=PACKAGE && LA52_52<=FUNCTION)||(LA52_52>=DOT && LA52_52<=GLOBAL)||LA52_52==COMMA||(LA52_52>=QUERY && LA52_52<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_6>=PACKAGE && LA52_6<=EVENT)||(LA52_6>=DOT && LA52_6<=GLOBAL)||LA52_6==COMMA||(LA52_6>=QUERY && LA52_6<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_52);
+                        input.seek(index52_6);
                         if ( s>=0 ) return s;
                         break;
                     case 18 : 
-                        int LA52_4 = input.LA(1);
+                        int LA52_33 = input.LA(1);
 
                          
-                        int index52_4 = input.index();
+                        int index52_33 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_4==EXISTS) ) {s = 14;}
+                        if ( ((LA52_33>=PACKAGE && LA52_33<=ID)||LA52_33==GLOBAL||(LA52_33>=QUERY && LA52_33<=ATTRIBUTES)||LA52_33==ENABLED||LA52_33==SALIENCE||(LA52_33>=DURATION && LA52_33<=DIALECT)||LA52_33==FROM||(LA52_33>=INIT && LA52_33<=RESULT)||(LA52_33>=CONTAINS && LA52_33<=MEMBEROF)||LA52_33==IN||LA52_33==THEN) ) {s = 66;}
 
-                        else if ( (LA52_4==NOT) ) {s = 15;}
+                        else if ( (LA52_33==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_4==EVAL) ) {s = 16;}
+                        else if ( (LA52_33==DOT||LA52_33==COMMA||(LA52_33>=DATE_EFFECTIVE && LA52_33<=DATE_EXPIRES)||LA52_33==BOOL||(LA52_33>=INT && LA52_33<=AGENDA_GROUP)||(LA52_33>=LOCK_ON_ACTIVE && LA52_33<=DOUBLE_AMPER)||(LA52_33>=EXISTS && LA52_33<=ACCUMULATE)||LA52_33==COLLECT||LA52_33==TILDE||(LA52_33>=FLOAT && LA52_33<=RIGHT_SQUARE)||(LA52_33>=EOL && LA52_33<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_4==FORALL) ) {s = 17;}
+                        else if ( (LA52_33==LEFT_PAREN) && (synpred7())) {s = 67;}
 
-                        else if ( (LA52_4==LEFT_PAREN) ) {s = 18;}
-
-                        else if ( (LA52_4==ID) ) {s = 19;}
-
-                        else if ( (LA52_4==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_4>=PACKAGE && LA52_4<=FUNCTION)||(LA52_4>=DOT && LA52_4<=GLOBAL)||LA52_4==COMMA||(LA52_4>=QUERY && LA52_4<=FROM)||(LA52_4>=ACCUMULATE && LA52_4<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_4);
+                        input.seek(index52_33);
                         if ( s>=0 ) return s;
                         break;
                     case 19 : 
-                        int LA52_63 = input.LA(1);
+                        int LA52_57 = input.LA(1);
 
                          
-                        int index52_63 = input.index();
+                        int index52_57 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( ((LA52_57>=PACKAGE && LA52_57<=ID)||LA52_57==GLOBAL||(LA52_57>=QUERY && LA52_57<=ATTRIBUTES)||LA52_57==ENABLED||LA52_57==SALIENCE||(LA52_57>=DURATION && LA52_57<=DIALECT)||LA52_57==FROM||(LA52_57>=INIT && LA52_57<=RESULT)||(LA52_57>=CONTAINS && LA52_57<=MEMBEROF)||LA52_57==IN||LA52_57==THEN) ) {s = 95;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_57==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( (LA52_57==DOT||LA52_57==COMMA||(LA52_57>=DATE_EFFECTIVE && LA52_57<=DATE_EXPIRES)||LA52_57==BOOL||(LA52_57>=INT && LA52_57<=AGENDA_GROUP)||(LA52_57>=LOCK_ON_ACTIVE && LA52_57<=DOUBLE_AMPER)||(LA52_57>=EXISTS && LA52_57<=ACCUMULATE)||LA52_57==COLLECT||LA52_57==TILDE||(LA52_57>=FLOAT && LA52_57<=RIGHT_SQUARE)||(LA52_57>=EOL && LA52_57<=83)) && (synpred7())) {s = 13;}
+
+                        else if ( (LA52_57==LEFT_PAREN) && (synpred7())) {s = 67;}
+
                          
-                        input.seek(index52_63);
+                        input.seek(index52_57);
                         if ( s>=0 ) return s;
                         break;
                     case 20 : 
-                        int LA52_23 = input.LA(1);
+                        int LA52_61 = input.LA(1);
 
                          
-                        int index52_23 = input.index();
+                        int index52_61 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_23==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        if ( ((LA52_61>=PACKAGE && LA52_61<=ID)||LA52_61==GLOBAL||(LA52_61>=QUERY && LA52_61<=ATTRIBUTES)||LA52_61==ENABLED||LA52_61==SALIENCE||(LA52_61>=DURATION && LA52_61<=DIALECT)||LA52_61==FROM||(LA52_61>=INIT && LA52_61<=RESULT)||(LA52_61>=CONTAINS && LA52_61<=MEMBEROF)||LA52_61==IN||LA52_61==THEN) ) {s = 99;}
 
-                        else if ( ((LA52_23>=PACKAGE && LA52_23<=GLOBAL)||LA52_23==COMMA||(LA52_23>=QUERY && LA52_23<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_61==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_23==LEFT_PAREN) ) {s = 50;}
+                        else if ( (LA52_61==DOT||LA52_61==COMMA||(LA52_61>=DATE_EFFECTIVE && LA52_61<=DATE_EXPIRES)||LA52_61==BOOL||(LA52_61>=INT && LA52_61<=AGENDA_GROUP)||(LA52_61>=LOCK_ON_ACTIVE && LA52_61<=DOUBLE_AMPER)||(LA52_61>=EXISTS && LA52_61<=ACCUMULATE)||LA52_61==COLLECT||LA52_61==TILDE||(LA52_61>=FLOAT && LA52_61<=RIGHT_SQUARE)||(LA52_61>=EOL && LA52_61<=83)) && (synpred7())) {s = 13;}
 
+                        else if ( (LA52_61==LEFT_PAREN) && (synpred7())) {s = 67;}
+
                          
-                        input.seek(index52_23);
+                        input.seek(index52_61);
                         if ( s>=0 ) return s;
                         break;
                     case 21 : 
-                        int LA52_65 = input.LA(1);
+                        int LA52_32 = input.LA(1);
 
                          
-                        int index52_65 = input.index();
+                        int index52_32 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_32==ID) ) {s = 64;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_32==LEFT_PAREN) ) {s = 65;}
 
+                        else if ( (LA52_32==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_32>=PACKAGE && LA52_32<=EVENT)||(LA52_32>=DOT && LA52_32<=GLOBAL)||LA52_32==COMMA||(LA52_32>=QUERY && LA52_32<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_65);
+                        input.seek(index52_32);
                         if ( s>=0 ) return s;
                         break;
                     case 22 : 
-                        int LA52_43 = input.LA(1);
+                        int LA52_56 = input.LA(1);
 
                          
-                        int index52_43 = input.index();
+                        int index52_56 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( ((LA52_43>=PACKAGE && LA52_43<=ID)||LA52_43==GLOBAL||(LA52_43>=QUERY && LA52_43<=ATTRIBUTES)||LA52_43==ENABLED||LA52_43==SALIENCE||(LA52_43>=DURATION && LA52_43<=DIALECT)||LA52_43==FROM||(LA52_43>=INIT && LA52_43<=RESULT)||(LA52_43>=CONTAINS && LA52_43<=IN)||LA52_43==THEN) ) {s = 79;}
+                        if ( (LA52_56==ID) ) {s = 93;}
 
-                        else if ( (LA52_43==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_56==LEFT_PAREN) ) {s = 94;}
 
-                        else if ( (LA52_43==DOT||LA52_43==COMMA||(LA52_43>=DATE_EFFECTIVE && LA52_43<=DATE_EXPIRES)||LA52_43==BOOL||(LA52_43>=INT && LA52_43<=AGENDA_GROUP)||(LA52_43>=LOCK_ON_ACTIVE && LA52_43<=DOUBLE_AMPER)||(LA52_43>=EXISTS && LA52_43<=ACCUMULATE)||LA52_43==COLLECT||(LA52_43>=FLOAT && LA52_43<=RIGHT_SQUARE)||(LA52_43>=EOL && LA52_43<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_56==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_43==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( ((LA52_56>=PACKAGE && LA52_56<=EVENT)||(LA52_56>=DOT && LA52_56<=GLOBAL)||LA52_56==COMMA||(LA52_56>=QUERY && LA52_56<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_43);
+                        input.seek(index52_56);
                         if ( s>=0 ) return s;
                         break;
                     case 23 : 
-                        int LA52_29 = input.LA(1);
+                        int LA52_60 = input.LA(1);
 
                          
-                        int index52_29 = input.index();
+                        int index52_60 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_29==74) ) {s = 60;}
+                        if ( (LA52_60==ID) ) {s = 97;}
 
-                        else if ( (LA52_29==DOT) ) {s = 61;}
+                        else if ( (LA52_60==LEFT_PAREN) ) {s = 98;}
 
-                        else if ( (LA52_29==LEFT_SQUARE) ) {s = 62;}
+                        else if ( (LA52_60==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_29==LEFT_PAREN) ) {s = 63;}
+                        else if ( ((LA52_60>=PACKAGE && LA52_60<=EVENT)||(LA52_60>=DOT && LA52_60<=GLOBAL)||LA52_60==COMMA||(LA52_60>=QUERY && LA52_60<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_29==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_29>=PACKAGE && LA52_29<=ID)||LA52_29==GLOBAL||LA52_29==COMMA||(LA52_29>=QUERY && LA52_29<=RIGHT_CURLY)||(LA52_29>=RIGHT_SQUARE && LA52_29<=73)||(LA52_29>=75 && LA52_29<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_29);
+                        input.seek(index52_60);
                         if ( s>=0 ) return s;
                         break;
                     case 24 : 
-                        int LA52_27 = input.LA(1);
+                        int LA52_5 = input.LA(1);
 
                          
-                        int index52_27 = input.index();
+                        int index52_5 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_27==74) ) {s = 56;}
+                        if ( (LA52_5==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_27==DOT) ) {s = 57;}
+                        else if ( (LA52_5==EXISTS) ) {s = 20;}
 
-                        else if ( (LA52_27==LEFT_SQUARE) ) {s = 58;}
+                        else if ( (LA52_5==LEFT_PAREN) ) {s = 21;}
 
-                        else if ( (LA52_27==LEFT_PAREN) ) {s = 59;}
+                        else if ( (LA52_5==NOT) ) {s = 22;}
 
-                        else if ( (LA52_27==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_5==EVAL) ) {s = 23;}
 
-                        else if ( ((LA52_27>=PACKAGE && LA52_27<=ID)||LA52_27==GLOBAL||LA52_27==COMMA||(LA52_27>=QUERY && LA52_27<=RIGHT_CURLY)||(LA52_27>=RIGHT_SQUARE && LA52_27<=73)||(LA52_27>=75 && LA52_27<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_5==FORALL) ) {s = 24;}
 
+                        else if ( (LA52_5==ID) ) {s = 25;}
+
+                        else if ( ((LA52_5>=PACKAGE && LA52_5<=EVENT)||(LA52_5>=DOT && LA52_5<=GLOBAL)||LA52_5==COMMA||(LA52_5>=QUERY && LA52_5<=FROM)||(LA52_5>=ACCUMULATE && LA52_5<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_27);
+                        input.seek(index52_5);
                         if ( s>=0 ) return s;
                         break;
                     case 25 : 
-                        int LA52_12 = input.LA(1);
+                        int LA52_36 = input.LA(1);
 
                          
-                        int index52_12 = input.index();
+                        int index52_36 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_12==74) ) {s = 32;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_12==DOT) ) {s = 33;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_12==LEFT_SQUARE) ) {s = 34;}
-
-                        else if ( (LA52_12==LEFT_PAREN) ) {s = 35;}
-
-                        else if ( (LA52_12==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_12>=PACKAGE && LA52_12<=ID)||LA52_12==GLOBAL||LA52_12==COMMA||(LA52_12>=QUERY && LA52_12<=RIGHT_CURLY)||(LA52_12>=RIGHT_SQUARE && LA52_12<=73)||(LA52_12>=75 && LA52_12<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_12);
+                        input.seek(index52_36);
                         if ( s>=0 ) return s;
                         break;
                     case 26 : 
-                        int LA52_66 = input.LA(1);
+                        int LA52_29 = input.LA(1);
 
                          
-                        int index52_66 = input.index();
+                        int index52_29 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_66==LEFT_SQUARE) ) {s = 34;}
+                        if ( (LA52_29==76) ) {s = 60;}
 
-                        else if ( (LA52_66==LEFT_PAREN) ) {s = 35;}
+                        else if ( (LA52_29==DOT) ) {s = 61;}
 
-                        else if ( (LA52_66==DOT) ) {s = 33;}
+                        else if ( (LA52_29==LEFT_SQUARE) ) {s = 62;}
 
-                        else if ( (LA52_66==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_29==LEFT_PAREN) ) {s = 63;}
 
-                        else if ( ((LA52_66>=PACKAGE && LA52_66<=ID)||LA52_66==GLOBAL||LA52_66==COMMA||(LA52_66>=QUERY && LA52_66<=RIGHT_CURLY)||(LA52_66>=RIGHT_SQUARE && LA52_66<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_29==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( ((LA52_29>=PACKAGE && LA52_29<=ID)||LA52_29==GLOBAL||LA52_29==COMMA||(LA52_29>=QUERY && LA52_29<=RIGHT_CURLY)||(LA52_29>=RIGHT_SQUARE && LA52_29<=75)||(LA52_29>=77 && LA52_29<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_66);
+                        input.seek(index52_29);
                         if ( s>=0 ) return s;
                         break;
                     case 27 : 
-                        int LA52_22 = input.LA(1);
+                        int LA52_27 = input.LA(1);
 
                          
-                        int index52_22 = input.index();
+                        int index52_27 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_22==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        if ( (LA52_27==76) ) {s = 56;}
 
-                        else if ( (LA52_22==ID) ) {s = 48;}
+                        else if ( (LA52_27==DOT) ) {s = 57;}
 
-                        else if ( (LA52_22==LEFT_PAREN) ) {s = 49;}
+                        else if ( (LA52_27==LEFT_SQUARE) ) {s = 58;}
 
-                        else if ( ((LA52_22>=PACKAGE && LA52_22<=FUNCTION)||(LA52_22>=DOT && LA52_22<=GLOBAL)||LA52_22==COMMA||(LA52_22>=QUERY && LA52_22<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_27==LEFT_PAREN) ) {s = 59;}
 
+                        else if ( (LA52_27==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_27>=PACKAGE && LA52_27<=ID)||LA52_27==GLOBAL||LA52_27==COMMA||(LA52_27>=QUERY && LA52_27<=RIGHT_CURLY)||(LA52_27>=RIGHT_SQUARE && LA52_27<=75)||(LA52_27>=77 && LA52_27<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_22);
+                        input.seek(index52_27);
                         if ( s>=0 ) return s;
                         break;
                     case 28 : 
-                        int LA52_0 = input.LA(1);
+                        int LA52_12 = input.LA(1);
 
                          
-                        int index52_0 = input.index();
+                        int index52_12 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_0==LEFT_SQUARE) && (synpred6())) {s = 1;}
+                        if ( (LA52_12==76) ) {s = 32;}
 
-                        else if ( (LA52_0==LEFT_PAREN) ) {s = 2;}
+                        else if ( (LA52_12==DOT) ) {s = 33;}
 
-                        else if ( ((LA52_0>=ID && LA52_0<=DOT)||(LA52_0>=COMMA && LA52_0<=RIGHT_PAREN)||LA52_0==END||(LA52_0>=OR && LA52_0<=DOUBLE_AMPER)||(LA52_0>=EXISTS && LA52_0<=FORALL)||LA52_0==INIT||LA52_0==THEN||LA52_0==72) ) {s = 3;}
+                        else if ( (LA52_12==LEFT_SQUARE) ) {s = 34;}
 
+                        else if ( (LA52_12==LEFT_PAREN) ) {s = 35;}
+
+                        else if ( (LA52_12==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_12>=PACKAGE && LA52_12<=ID)||LA52_12==GLOBAL||LA52_12==COMMA||(LA52_12>=QUERY && LA52_12<=RIGHT_CURLY)||(LA52_12>=RIGHT_SQUARE && LA52_12<=75)||(LA52_12>=77 && LA52_12<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_0);
+                        input.seek(index52_12);
                         if ( s>=0 ) return s;
                         break;
                     case 29 : 
-                        int LA52_14 = input.LA(1);
+                        int LA52_18 = input.LA(1);
 
                          
-                        int index52_14 = input.index();
+                        int index52_18 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_14==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        if ( (synpred7()) ) {s = 13;}
 
-                        else if ( (LA52_14==ID) ) {s = 36;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_14==LEFT_PAREN) ) {s = 37;}
-
-                        else if ( ((LA52_14>=PACKAGE && LA52_14<=FUNCTION)||(LA52_14>=DOT && LA52_14<=GLOBAL)||LA52_14==COMMA||(LA52_14>=QUERY && LA52_14<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_14);
+                        input.seek(index52_18);
                         if ( s>=0 ) return s;
                         break;
                     case 30 : 
-                        int LA52_41 = input.LA(1);
+                        int LA52_43 = input.LA(1);
 
                          
-                        int index52_41 = input.index();
+                        int index52_43 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( ((LA52_43>=PACKAGE && LA52_43<=ID)||LA52_43==GLOBAL||(LA52_43>=QUERY && LA52_43<=ATTRIBUTES)||LA52_43==ENABLED||LA52_43==SALIENCE||(LA52_43>=DURATION && LA52_43<=DIALECT)||LA52_43==FROM||(LA52_43>=INIT && LA52_43<=RESULT)||(LA52_43>=CONTAINS && LA52_43<=MEMBEROF)||LA52_43==IN||LA52_43==THEN) ) {s = 79;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_43==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( (LA52_43==DOT||LA52_43==COMMA||(LA52_43>=DATE_EFFECTIVE && LA52_43<=DATE_EXPIRES)||LA52_43==BOOL||(LA52_43>=INT && LA52_43<=AGENDA_GROUP)||(LA52_43>=LOCK_ON_ACTIVE && LA52_43<=DOUBLE_AMPER)||(LA52_43>=EXISTS && LA52_43<=ACCUMULATE)||LA52_43==COLLECT||LA52_43==TILDE||(LA52_43>=FLOAT && LA52_43<=RIGHT_SQUARE)||(LA52_43>=EOL && LA52_43<=83)) && (synpred7())) {s = 13;}
+
+                        else if ( (LA52_43==LEFT_PAREN) && (synpred7())) {s = 67;}
+
                          
-                        input.seek(index52_41);
+                        input.seek(index52_43);
                         if ( s>=0 ) return s;
                         break;
                     case 31 : 
-                        int LA52_37 = input.LA(1);
+                        int LA52_41 = input.LA(1);
 
                          
-                        int index52_37 = input.index();
+                        int index52_41 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7()) ) {s = 67;}
@@ -8245,398 +8387,399 @@
                         else if ( (true) ) {s = 3;}
 
                          
-                        input.seek(index52_37);
+                        input.seek(index52_41);
                         if ( s>=0 ) return s;
                         break;
                     case 32 : 
-                        int LA52_64 = input.LA(1);
+                        int LA52_44 = input.LA(1);
 
                          
-                        int index52_64 = input.index();
+                        int index52_44 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_64==DOT) ) {s = 101;}
+                        if ( (LA52_44==RIGHT_SQUARE) ) {s = 80;}
 
-                        else if ( (LA52_64==LEFT_SQUARE) ) {s = 102;}
+                        else if ( (LA52_44==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_64==LEFT_PAREN) ) {s = 103;}
+                        else if ( ((LA52_44>=PACKAGE && LA52_44<=GLOBAL)||LA52_44==COMMA||(LA52_44>=QUERY && LA52_44<=LEFT_SQUARE)||(LA52_44>=THEN && LA52_44<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_64==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_44==LEFT_PAREN) && (synpred7())) {s = 67;}
 
-                        else if ( ((LA52_64>=PACKAGE && LA52_64<=ID)||LA52_64==GLOBAL||LA52_64==COMMA||(LA52_64>=QUERY && LA52_64<=RIGHT_CURLY)||(LA52_64>=RIGHT_SQUARE && LA52_64<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_64);
+                        input.seek(index52_44);
                         if ( s>=0 ) return s;
                         break;
                     case 33 : 
-                        int LA52_5 = input.LA(1);
+                        int LA52_34 = input.LA(1);
 
                          
-                        int index52_5 = input.index();
+                        int index52_34 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_5==LEFT_PAREN) ) {s = 20;}
+                        if ( (LA52_34==RIGHT_SQUARE) ) {s = 68;}
 
-                        else if ( (LA52_5==EXISTS) ) {s = 21;}
+                        else if ( (LA52_34==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_5==NOT) ) {s = 22;}
+                        else if ( ((LA52_34>=PACKAGE && LA52_34<=GLOBAL)||LA52_34==COMMA||(LA52_34>=QUERY && LA52_34<=LEFT_SQUARE)||(LA52_34>=THEN && LA52_34<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_5==EVAL) ) {s = 23;}
+                        else if ( (LA52_34==LEFT_PAREN) && (synpred7())) {s = 67;}
 
-                        else if ( (LA52_5==FORALL) ) {s = 24;}
-
-                        else if ( (LA52_5==ID) ) {s = 25;}
-
-                        else if ( (LA52_5==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_5>=PACKAGE && LA52_5<=FUNCTION)||(LA52_5>=DOT && LA52_5<=GLOBAL)||LA52_5==COMMA||(LA52_5>=QUERY && LA52_5<=FROM)||(LA52_5>=ACCUMULATE && LA52_5<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_5);
+                        input.seek(index52_34);
                         if ( s>=0 ) return s;
                         break;
                     case 34 : 
-                        int LA52_33 = input.LA(1);
+                        int LA52_58 = input.LA(1);
 
                          
-                        int index52_33 = input.index();
+                        int index52_58 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( ((LA52_33>=PACKAGE && LA52_33<=ID)||LA52_33==GLOBAL||(LA52_33>=QUERY && LA52_33<=ATTRIBUTES)||LA52_33==ENABLED||LA52_33==SALIENCE||(LA52_33>=DURATION && LA52_33<=DIALECT)||LA52_33==FROM||(LA52_33>=INIT && LA52_33<=RESULT)||(LA52_33>=CONTAINS && LA52_33<=IN)||LA52_33==THEN) ) {s = 66;}
+                        if ( (LA52_58==RIGHT_SQUARE) ) {s = 96;}
 
-                        else if ( (LA52_33==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_58==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_33==DOT||LA52_33==COMMA||(LA52_33>=DATE_EFFECTIVE && LA52_33<=DATE_EXPIRES)||LA52_33==BOOL||(LA52_33>=INT && LA52_33<=AGENDA_GROUP)||(LA52_33>=LOCK_ON_ACTIVE && LA52_33<=DOUBLE_AMPER)||(LA52_33>=EXISTS && LA52_33<=ACCUMULATE)||LA52_33==COLLECT||(LA52_33>=FLOAT && LA52_33<=RIGHT_SQUARE)||(LA52_33>=EOL && LA52_33<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_58>=PACKAGE && LA52_58<=GLOBAL)||LA52_58==COMMA||(LA52_58>=QUERY && LA52_58<=LEFT_SQUARE)||(LA52_58>=THEN && LA52_58<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_33==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( (LA52_58==LEFT_PAREN) && (synpred7())) {s = 67;}
 
                          
-                        input.seek(index52_33);
+                        input.seek(index52_58);
                         if ( s>=0 ) return s;
                         break;
                     case 35 : 
-                        int LA52_57 = input.LA(1);
+                        int LA52_62 = input.LA(1);
 
                          
-                        int index52_57 = input.index();
+                        int index52_62 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( ((LA52_57>=PACKAGE && LA52_57<=ID)||LA52_57==GLOBAL||(LA52_57>=QUERY && LA52_57<=ATTRIBUTES)||LA52_57==ENABLED||LA52_57==SALIENCE||(LA52_57>=DURATION && LA52_57<=DIALECT)||LA52_57==FROM||(LA52_57>=INIT && LA52_57<=RESULT)||(LA52_57>=CONTAINS && LA52_57<=IN)||LA52_57==THEN) ) {s = 95;}
+                        if ( (LA52_62==RIGHT_SQUARE) ) {s = 100;}
 
-                        else if ( (LA52_57==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_62==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_57==DOT||LA52_57==COMMA||(LA52_57>=DATE_EFFECTIVE && LA52_57<=DATE_EXPIRES)||LA52_57==BOOL||(LA52_57>=INT && LA52_57<=AGENDA_GROUP)||(LA52_57>=LOCK_ON_ACTIVE && LA52_57<=DOUBLE_AMPER)||(LA52_57>=EXISTS && LA52_57<=ACCUMULATE)||LA52_57==COLLECT||(LA52_57>=FLOAT && LA52_57<=RIGHT_SQUARE)||(LA52_57>=EOL && LA52_57<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_62>=PACKAGE && LA52_62<=GLOBAL)||LA52_62==COMMA||(LA52_62>=QUERY && LA52_62<=LEFT_SQUARE)||(LA52_62>=THEN && LA52_62<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_57==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( (LA52_62==LEFT_PAREN) && (synpred7())) {s = 67;}
 
                          
-                        input.seek(index52_57);
+                        input.seek(index52_62);
                         if ( s>=0 ) return s;
                         break;
                     case 36 : 
-                        int LA52_61 = input.LA(1);
+                        int LA52_35 = input.LA(1);
 
                          
-                        int index52_61 = input.index();
+                        int index52_35 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_61==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( ((LA52_61>=PACKAGE && LA52_61<=ID)||LA52_61==GLOBAL||(LA52_61>=QUERY && LA52_61<=ATTRIBUTES)||LA52_61==ENABLED||LA52_61==SALIENCE||(LA52_61>=DURATION && LA52_61<=DIALECT)||LA52_61==FROM||(LA52_61>=INIT && LA52_61<=RESULT)||(LA52_61>=CONTAINS && LA52_61<=IN)||LA52_61==THEN) ) {s = 99;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_61==LEFT_PAREN) && (synpred7())) {s = 67;}
-
-                        else if ( (LA52_61==DOT||LA52_61==COMMA||(LA52_61>=DATE_EFFECTIVE && LA52_61<=DATE_EXPIRES)||LA52_61==BOOL||(LA52_61>=INT && LA52_61<=AGENDA_GROUP)||(LA52_61>=LOCK_ON_ACTIVE && LA52_61<=DOUBLE_AMPER)||(LA52_61>=EXISTS && LA52_61<=ACCUMULATE)||LA52_61==COLLECT||(LA52_61>=FLOAT && LA52_61<=RIGHT_SQUARE)||(LA52_61>=EOL && LA52_61<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_61);
+                        input.seek(index52_35);
                         if ( s>=0 ) return s;
                         break;
                     case 37 : 
-                        int LA52_39 = input.LA(1);
+                        int LA52_63 = input.LA(1);
 
                          
-                        int index52_39 = input.index();
+                        int index52_63 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_39==74) ) {s = 73;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_39==DOT) ) {s = 74;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_39==LEFT_SQUARE) ) {s = 75;}
-
-                        else if ( (LA52_39==LEFT_PAREN) ) {s = 76;}
-
-                        else if ( (LA52_39==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_39>=PACKAGE && LA52_39<=ID)||LA52_39==GLOBAL||LA52_39==COMMA||(LA52_39>=QUERY && LA52_39<=RIGHT_CURLY)||(LA52_39>=RIGHT_SQUARE && LA52_39<=73)||(LA52_39>=75 && LA52_39<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_39);
+                        input.seek(index52_63);
                         if ( s>=0 ) return s;
                         break;
                     case 38 : 
-                        int LA52_36 = input.LA(1);
+                        int LA52_65 = input.LA(1);
 
                          
-                        int index52_36 = input.index();
+                        int index52_65 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_36==74) ) {s = 69;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_36==DOT) ) {s = 70;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_36==LEFT_SQUARE) ) {s = 71;}
-
-                        else if ( (LA52_36==LEFT_PAREN) ) {s = 72;}
-
-                        else if ( (LA52_36==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_36>=PACKAGE && LA52_36<=ID)||LA52_36==GLOBAL||LA52_36==COMMA||(LA52_36>=QUERY && LA52_36<=RIGHT_CURLY)||(LA52_36>=RIGHT_SQUARE && LA52_36<=73)||(LA52_36>=75 && LA52_36<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_36);
+                        input.seek(index52_65);
                         if ( s>=0 ) return s;
                         break;
                     case 39 : 
-                        int LA52_19 = input.LA(1);
+                        int LA52_46 = input.LA(1);
 
                          
-                        int index52_19 = input.index();
+                        int index52_46 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_19==74) ) {s = 42;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_19==DOT) ) {s = 43;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_19==LEFT_SQUARE) ) {s = 44;}
-
-                        else if ( (LA52_19==LEFT_PAREN) ) {s = 45;}
-
-                        else if ( (LA52_19==RIGHT_PAREN) && (synpred7())) {s = 8;}
-
-                        else if ( ((LA52_19>=PACKAGE && LA52_19<=ID)||LA52_19==GLOBAL||LA52_19==COMMA||(LA52_19>=QUERY && LA52_19<=RIGHT_CURLY)||(LA52_19>=RIGHT_SQUARE && LA52_19<=73)||(LA52_19>=75 && LA52_19<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_19);
+                        input.seek(index52_46);
                         if ( s>=0 ) return s;
                         break;
                     case 40 : 
-                        int LA52_54 = input.LA(1);
+                        int LA52_40 = input.LA(1);
 
                          
-                        int index52_54 = input.index();
+                        int index52_40 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_54==RIGHT_SQUARE) ) {s = 92;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_54==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( ((LA52_54>=PACKAGE && LA52_54<=GLOBAL)||LA52_54==COMMA||(LA52_54>=QUERY && LA52_54<=LEFT_SQUARE)||(LA52_54>=THEN && LA52_54<=81)) && (synpred7())) {s = 13;}
-
-                        else if ( (LA52_54==LEFT_PAREN) && (synpred7())) {s = 67;}
-
                          
-                        input.seek(index52_54);
+                        input.seek(index52_40);
                         if ( s>=0 ) return s;
                         break;
                     case 41 : 
-                        int LA52_34 = input.LA(1);
+                        int LA52_38 = input.LA(1);
 
                          
-                        int index52_34 = input.index();
+                        int index52_38 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_34==RIGHT_SQUARE) ) {s = 68;}
+                        if ( (LA52_38==76) ) {s = 73;}
 
-                        else if ( (LA52_34==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_38==DOT) ) {s = 74;}
 
-                        else if ( ((LA52_34>=PACKAGE && LA52_34<=GLOBAL)||LA52_34==COMMA||(LA52_34>=QUERY && LA52_34<=LEFT_SQUARE)||(LA52_34>=THEN && LA52_34<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_38==LEFT_SQUARE) ) {s = 75;}
 
-                        else if ( (LA52_34==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( (LA52_38==LEFT_PAREN) ) {s = 76;}
 
+                        else if ( (LA52_38==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_38>=PACKAGE && LA52_38<=ID)||LA52_38==GLOBAL||LA52_38==COMMA||(LA52_38>=QUERY && LA52_38<=RIGHT_CURLY)||(LA52_38>=RIGHT_SQUARE && LA52_38<=75)||(LA52_38>=77 && LA52_38<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_34);
+                        input.seek(index52_38);
                         if ( s>=0 ) return s;
                         break;
                     case 42 : 
-                        int LA52_58 = input.LA(1);
+                        int LA52_37 = input.LA(1);
 
                          
-                        int index52_58 = input.index();
+                        int index52_37 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_58==RIGHT_SQUARE) ) {s = 96;}
+                        if ( (LA52_37==76) ) {s = 69;}
 
-                        else if ( (LA52_58==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_37==DOT) ) {s = 70;}
 
-                        else if ( ((LA52_58>=PACKAGE && LA52_58<=GLOBAL)||LA52_58==COMMA||(LA52_58>=QUERY && LA52_58<=LEFT_SQUARE)||(LA52_58>=THEN && LA52_58<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_37==LEFT_SQUARE) ) {s = 71;}
 
-                        else if ( (LA52_58==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( (LA52_37==LEFT_PAREN) ) {s = 72;}
 
+                        else if ( (LA52_37==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_37>=PACKAGE && LA52_37<=ID)||LA52_37==GLOBAL||LA52_37==COMMA||(LA52_37>=QUERY && LA52_37<=RIGHT_CURLY)||(LA52_37>=RIGHT_SQUARE && LA52_37<=75)||(LA52_37>=77 && LA52_37<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_58);
+                        input.seek(index52_37);
                         if ( s>=0 ) return s;
                         break;
                     case 43 : 
-                        int LA52_62 = input.LA(1);
+                        int LA52_19 = input.LA(1);
 
                          
-                        int index52_62 = input.index();
+                        int index52_19 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_62==RIGHT_SQUARE) ) {s = 100;}
+                        if ( (LA52_19==76) ) {s = 42;}
 
-                        else if ( (LA52_62==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_19==DOT) ) {s = 43;}
 
-                        else if ( ((LA52_62>=PACKAGE && LA52_62<=GLOBAL)||LA52_62==COMMA||(LA52_62>=QUERY && LA52_62<=LEFT_SQUARE)||(LA52_62>=THEN && LA52_62<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_19==LEFT_SQUARE) ) {s = 44;}
 
-                        else if ( (LA52_62==LEFT_PAREN) && (synpred7())) {s = 67;}
+                        else if ( (LA52_19==LEFT_PAREN) ) {s = 45;}
 
+                        else if ( (LA52_19==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_19>=PACKAGE && LA52_19<=ID)||LA52_19==GLOBAL||LA52_19==COMMA||(LA52_19>=QUERY && LA52_19<=RIGHT_CURLY)||(LA52_19>=RIGHT_SQUARE && LA52_19<=75)||(LA52_19>=77 && LA52_19<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_62);
+                        input.seek(index52_19);
                         if ( s>=0 ) return s;
                         break;
                     case 44 : 
-                        int LA52_17 = input.LA(1);
+                        int LA52_9 = input.LA(1);
 
                          
-                        int index52_17 = input.index();
+                        int index52_9 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_17==LEFT_PAREN) ) {s = 41;}
+                        if ( (LA52_9==LEFT_PAREN) ) {s = 28;}
 
-                        else if ( (LA52_17==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_9==ID) ) {s = 29;}
 
-                        else if ( ((LA52_17>=PACKAGE && LA52_17<=GLOBAL)||LA52_17==COMMA||(LA52_17>=QUERY && LA52_17<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_9==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( ((LA52_9>=PACKAGE && LA52_9<=EVENT)||(LA52_9>=DOT && LA52_9<=GLOBAL)||LA52_9==COMMA||(LA52_9>=QUERY && LA52_9<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_17);
+                        input.seek(index52_9);
                         if ( s>=0 ) return s;
                         break;
                     case 45 : 
-                        int LA52_50 = input.LA(1);
+                        int LA52_2 = input.LA(1);
 
                          
-                        int index52_50 = input.index();
+                        int index52_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_2==AND) ) {s = 4;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_2==OR) ) {s = 5;}
 
+                        else if ( (LA52_2==EXISTS) ) {s = 6;}
+
+                        else if ( (LA52_2==LEFT_PAREN) ) {s = 7;}
+
+                        else if ( (LA52_2==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( (LA52_2==NOT) ) {s = 9;}
+
+                        else if ( (LA52_2==EVAL) ) {s = 10;}
+
+                        else if ( (LA52_2==FORALL) ) {s = 11;}
+
+                        else if ( (LA52_2==ID) ) {s = 12;}
+
+                        else if ( ((LA52_2>=PACKAGE && LA52_2<=EVENT)||(LA52_2>=DOT && LA52_2<=GLOBAL)||LA52_2==COMMA||(LA52_2>=QUERY && LA52_2<=LOCK_ON_ACTIVE)||LA52_2==DOUBLE_PIPE||(LA52_2>=DOUBLE_AMPER && LA52_2<=FROM)||(LA52_2>=ACCUMULATE && LA52_2<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_50);
+                        input.seek(index52_2);
                         if ( s>=0 ) return s;
                         break;
                     case 46 : 
-                        int LA52_28 = input.LA(1);
+                        int LA52_10 = input.LA(1);
 
                          
-                        int index52_28 = input.index();
+                        int index52_10 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (LA52_10==LEFT_PAREN) ) {s = 30;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_10==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( ((LA52_10>=PACKAGE && LA52_10<=GLOBAL)||LA52_10==COMMA||(LA52_10>=QUERY && LA52_10<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_28);
+                        input.seek(index52_10);
                         if ( s>=0 ) return s;
                         break;
                     case 47 : 
-                        int LA52_45 = input.LA(1);
+                        int LA52_52 = input.LA(1);
 
                          
-                        int index52_45 = input.index();
+                        int index52_52 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_52==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_52==ID) ) {s = 89;}
 
+                        else if ( (LA52_52==LEFT_PAREN) ) {s = 90;}
+
+                        else if ( ((LA52_52>=PACKAGE && LA52_52<=EVENT)||(LA52_52>=DOT && LA52_52<=GLOBAL)||LA52_52==COMMA||(LA52_52>=QUERY && LA52_52<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_45);
+                        input.seek(index52_52);
                         if ( s>=0 ) return s;
                         break;
                     case 48 : 
-                        int LA52_7 = input.LA(1);
+                        int LA52_51 = input.LA(1);
 
                          
-                        int index52_7 = input.index();
+                        int index52_51 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (synpred7()) ) {s = 67;}
 
                         else if ( (true) ) {s = 3;}
 
                          
-                        input.seek(index52_7);
+                        input.seek(index52_51);
                         if ( s>=0 ) return s;
                         break;
                     case 49 : 
-                        int LA52_18 = input.LA(1);
+                        int LA52_23 = input.LA(1);
 
                          
-                        int index52_18 = input.index();
+                        int index52_23 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (LA52_23==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( ((LA52_23>=PACKAGE && LA52_23<=GLOBAL)||LA52_23==COMMA||(LA52_23>=QUERY && LA52_23<=83)) && (synpred7())) {s = 13;}
 
+                        else if ( (LA52_23==LEFT_PAREN) ) {s = 50;}
+
                          
-                        input.seek(index52_18);
+                        input.seek(index52_23);
                         if ( s>=0 ) return s;
                         break;
                     case 50 : 
-                        int LA52_2 = input.LA(1);
+                        int LA52_20 = input.LA(1);
 
                          
-                        int index52_2 = input.index();
+                        int index52_20 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_2==AND) ) {s = 4;}
+                        if ( (LA52_20==LEFT_PAREN) ) {s = 46;}
 
-                        else if ( (LA52_2==OR) ) {s = 5;}
+                        else if ( (LA52_20==ID) ) {s = 47;}
 
-                        else if ( (LA52_2==EXISTS) ) {s = 6;}
+                        else if ( (LA52_20==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_2==LEFT_PAREN) ) {s = 7;}
+                        else if ( ((LA52_20>=PACKAGE && LA52_20<=EVENT)||(LA52_20>=DOT && LA52_20<=GLOBAL)||LA52_20==COMMA||(LA52_20>=QUERY && LA52_20<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_2==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                         
+                        input.seek(index52_20);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 51 : 
+                        int LA52_17 = input.LA(1);
 
-                        else if ( (LA52_2==NOT) ) {s = 9;}
+                         
+                        int index52_17 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (LA52_17==LEFT_PAREN) ) {s = 41;}
 
-                        else if ( (LA52_2==EVAL) ) {s = 10;}
+                        else if ( (LA52_17==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_2==FORALL) ) {s = 11;}
+                        else if ( ((LA52_17>=PACKAGE && LA52_17<=GLOBAL)||LA52_17==COMMA||(LA52_17>=QUERY && LA52_17<=83)) && (synpred7())) {s = 13;}
 
-                        else if ( (LA52_2==ID) ) {s = 12;}
-
-                        else if ( ((LA52_2>=PACKAGE && LA52_2<=FUNCTION)||(LA52_2>=DOT && LA52_2<=GLOBAL)||LA52_2==COMMA||(LA52_2>=QUERY && LA52_2<=LOCK_ON_ACTIVE)||LA52_2==DOUBLE_PIPE||(LA52_2>=DOUBLE_AMPER && LA52_2<=FROM)||(LA52_2>=ACCUMULATE && LA52_2<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_2);
+                        input.seek(index52_17);
                         if ( s>=0 ) return s;
                         break;
-                    case 51 : 
-                        int LA52_47 = input.LA(1);
+                    case 52 : 
+                        int LA52_26 = input.LA(1);
 
                          
-                        int index52_47 = input.index();
+                        int index52_26 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (synpred7()) ) {s = 13;}
 
                         else if ( (true) ) {s = 3;}
 
                          
-                        input.seek(index52_47);
+                        input.seek(index52_26);
                         if ( s>=0 ) return s;
                         break;
-                    case 52 : 
+                    case 53 : 
                         int LA52_11 = input.LA(1);
 
                          
@@ -8647,49 +8790,44 @@
 
                         else if ( (LA52_11==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( ((LA52_11>=PACKAGE && LA52_11<=GLOBAL)||LA52_11==COMMA||(LA52_11>=QUERY && LA52_11<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_11>=PACKAGE && LA52_11<=GLOBAL)||LA52_11==COMMA||(LA52_11>=QUERY && LA52_11<=83)) && (synpred7())) {s = 13;}
 
                          
                         input.seek(index52_11);
                         if ( s>=0 ) return s;
                         break;
-                    case 53 : 
-                        int LA52_16 = input.LA(1);
+                    case 54 : 
+                        int LA52_4 = input.LA(1);
 
                          
-                        int index52_16 = input.index();
+                        int index52_4 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_16==LEFT_PAREN) ) {s = 40;}
+                        if ( (LA52_4==EXISTS) ) {s = 14;}
 
-                        else if ( (LA52_16==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_4==NOT) ) {s = 15;}
 
-                        else if ( ((LA52_16>=PACKAGE && LA52_16<=GLOBAL)||LA52_16==COMMA||(LA52_16>=QUERY && LA52_16<=81)) && (synpred7())) {s = 13;}
+                        else if ( (LA52_4==EVAL) ) {s = 16;}
 
-                         
-                        input.seek(index52_16);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 54 : 
-                        int LA52_26 = input.LA(1);
+                        else if ( (LA52_4==FORALL) ) {s = 17;}
 
-                         
-                        int index52_26 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        else if ( (LA52_4==LEFT_PAREN) ) {s = 18;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_4==ID) ) {s = 19;}
 
+                        else if ( (LA52_4==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_4>=PACKAGE && LA52_4<=EVENT)||(LA52_4>=DOT && LA52_4<=GLOBAL)||LA52_4==COMMA||(LA52_4>=QUERY && LA52_4<=FROM)||(LA52_4>=ACCUMULATE && LA52_4<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_26);
+                        input.seek(index52_4);
                         if ( s>=0 ) return s;
                         break;
                     case 55 : 
-                        int LA52_38 = input.LA(1);
+                        int LA52_49 = input.LA(1);
 
                          
-                        int index52_38 = input.index();
+                        int index52_49 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7()) ) {s = 67;}
@@ -8697,122 +8835,130 @@
                         else if ( (true) ) {s = 3;}
 
                          
-                        input.seek(index52_38);
+                        input.seek(index52_49);
                         if ( s>=0 ) return s;
                         break;
                     case 56 : 
-                        int LA52_51 = input.LA(1);
+                        int LA52_14 = input.LA(1);
 
                          
-                        int index52_51 = input.index();
+                        int index52_14 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( (LA52_14==LEFT_PAREN) ) {s = 36;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_14==ID) ) {s = 37;}
 
+                        else if ( (LA52_14==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_14>=PACKAGE && LA52_14<=EVENT)||(LA52_14>=DOT && LA52_14<=GLOBAL)||LA52_14==COMMA||(LA52_14>=QUERY && LA52_14<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_51);
+                        input.seek(index52_14);
                         if ( s>=0 ) return s;
                         break;
                     case 57 : 
-                        int LA52_53 = input.LA(1);
+                        int LA52_59 = input.LA(1);
 
                          
-                        int index52_53 = input.index();
+                        int index52_59 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( ((LA52_53>=PACKAGE && LA52_53<=ID)||LA52_53==GLOBAL||(LA52_53>=QUERY && LA52_53<=ATTRIBUTES)||LA52_53==ENABLED||LA52_53==SALIENCE||(LA52_53>=DURATION && LA52_53<=DIALECT)||LA52_53==FROM||(LA52_53>=INIT && LA52_53<=RESULT)||(LA52_53>=CONTAINS && LA52_53<=IN)||LA52_53==THEN) ) {s = 91;}
+                        if ( (synpred7()) ) {s = 67;}
 
-                        else if ( (LA52_53==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( (LA52_53==DOT||LA52_53==COMMA||(LA52_53>=DATE_EFFECTIVE && LA52_53<=DATE_EXPIRES)||LA52_53==BOOL||(LA52_53>=INT && LA52_53<=AGENDA_GROUP)||(LA52_53>=LOCK_ON_ACTIVE && LA52_53<=DOUBLE_AMPER)||(LA52_53>=EXISTS && LA52_53<=ACCUMULATE)||LA52_53==COLLECT||(LA52_53>=FLOAT && LA52_53<=RIGHT_SQUARE)||(LA52_53>=EOL && LA52_53<=81)) && (synpred7())) {s = 13;}
-
-                        else if ( (LA52_53==LEFT_PAREN) && (synpred7())) {s = 67;}
-
                          
-                        input.seek(index52_53);
+                        input.seek(index52_59);
                         if ( s>=0 ) return s;
                         break;
                     case 58 : 
-                        int LA52_15 = input.LA(1);
+                        int LA52_22 = input.LA(1);
 
                          
-                        int index52_15 = input.index();
+                        int index52_22 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_15==LEFT_PAREN) ) {s = 38;}
+                        if ( (LA52_22==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (LA52_15==ID) ) {s = 39;}
+                        else if ( (LA52_22==ID) ) {s = 48;}
 
-                        else if ( (LA52_15==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (LA52_22==LEFT_PAREN) ) {s = 49;}
 
-                        else if ( ((LA52_15>=PACKAGE && LA52_15<=FUNCTION)||(LA52_15>=DOT && LA52_15<=GLOBAL)||LA52_15==COMMA||(LA52_15>=QUERY && LA52_15<=81)) && (synpred7())) {s = 13;}
+                        else if ( ((LA52_22>=PACKAGE && LA52_22<=EVENT)||(LA52_22>=DOT && LA52_22<=GLOBAL)||LA52_22==COMMA||(LA52_22>=QUERY && LA52_22<=83)) && (synpred7())) {s = 13;}
 
                          
-                        input.seek(index52_15);
+                        input.seek(index52_22);
                         if ( s>=0 ) return s;
                         break;
                     case 59 : 
-                        int LA52_31 = input.LA(1);
+                        int LA52_42 = input.LA(1);
 
                          
-                        int index52_31 = input.index();
+                        int index52_42 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (LA52_42==ID) ) {s = 77;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_42==LEFT_PAREN) ) {s = 78;}
 
+                        else if ( (LA52_42==RIGHT_PAREN) && (synpred7())) {s = 8;}
+
+                        else if ( ((LA52_42>=PACKAGE && LA52_42<=EVENT)||(LA52_42>=DOT && LA52_42<=GLOBAL)||LA52_42==COMMA||(LA52_42>=QUERY && LA52_42<=83)) && (synpred7())) {s = 13;}
+
                          
-                        input.seek(index52_31);
+                        input.seek(index52_42);
                         if ( s>=0 ) return s;
                         break;
                     case 60 : 
-                        int LA52_24 = input.LA(1);
+                        int LA52_7 = input.LA(1);
 
                          
-                        int index52_24 = input.index();
+                        int index52_7 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA52_24==LEFT_PAREN) ) {s = 51;}
+                        if ( (synpred7()) ) {s = 13;}
 
-                        else if ( (LA52_24==RIGHT_PAREN) && (synpred7())) {s = 8;}
+                        else if ( (true) ) {s = 3;}
 
-                        else if ( ((LA52_24>=PACKAGE && LA52_24<=GLOBAL)||LA52_24==COMMA||(LA52_24>=QUERY && LA52_24<=81)) && (synpred7())) {s = 13;}
-
                          
-                        input.seek(index52_24);
+                        input.seek(index52_7);
                         if ( s>=0 ) return s;
                         break;
                     case 61 : 
-                        int LA52_40 = input.LA(1);
+                        int LA52_53 = input.LA(1);
 
                          
-                        int index52_40 = input.index();
+                        int index52_53 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 67;}
+                        if ( ((LA52_53>=PACKAGE && LA52_53<=ID)||LA52_53==GLOBAL||(LA52_53>=QUERY && LA52_53<=ATTRIBUTES)||LA52_53==ENABLED||LA52_53==SALIENCE||(LA52_53>=DURATION && LA52_53<=DIALECT)||LA52_53==FROM||(LA52_53>=INIT && LA52_53<=RESULT)||(LA52_53>=CONTAINS && LA52_53<=MEMBEROF)||LA52_53==IN||LA52_53==THEN) ) {s = 91;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( (LA52_53==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
+                        else if ( (LA52_53==DOT||LA52_53==COMMA||(LA52_53>=DATE_EFFECTIVE && LA52_53<=DATE_EXPIRES)||LA52_53==BOOL||(LA52_53>=INT && LA52_53<=AGENDA_GROUP)||(LA52_53>=LOCK_ON_ACTIVE && LA52_53<=DOUBLE_AMPER)||(LA52_53>=EXISTS && LA52_53<=ACCUMULATE)||LA52_53==COLLECT||LA52_53==TILDE||(LA52_53>=FLOAT && LA52_53<=RIGHT_SQUARE)||(LA52_53>=EOL && LA52_53<=83)) && (synpred7())) {s = 13;}
+
+                        else if ( (LA52_53==LEFT_PAREN) && (synpred7())) {s = 67;}
+
                          
-                        input.seek(index52_40);
+                        input.seek(index52_53);
                         if ( s>=0 ) return s;
                         break;
                     case 62 : 
-                        int LA52_30 = input.LA(1);
+                        int LA52_16 = input.LA(1);
 
                          
-                        int index52_30 = input.index();
+                        int index52_16 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred7()) ) {s = 13;}
+                        if ( (LA52_16==RIGHT_PAREN) && (synpred7())) {s = 8;}
 
-                        else if ( (true) ) {s = 3;}
+                        else if ( ((LA52_16>=PACKAGE && LA52_16<=GLOBAL)||LA52_16==COMMA||(LA52_16>=QUERY && LA52_16<=83)) && (synpred7())) {s = 13;}
 
+                        else if ( (LA52_16==LEFT_PAREN) ) {s = 40;}
+
                          
-                        input.seek(index52_30);
+                        input.seek(index52_16);
                         if ( s>=0 ) return s;
                         break;
             }
@@ -8828,9 +8974,9 @@
     static final String DFA64_eofS =
         "\23\uffff";
     static final String DFA64_minS =
-        "\1\13\1\uffff\1\4\1\10\1\0\1\4\1\uffff\1\4\13\0";
+        "\1\14\1\uffff\1\4\1\11\1\0\1\4\1\uffff\1\4\13\0";
     static final String DFA64_maxS =
-        "\1\45\1\uffff\2\121\1\0\1\121\1\uffff\1\121\13\0";
+        "\1\46\1\uffff\2\123\1\0\1\123\1\uffff\1\123\13\0";
     static final String DFA64_acceptS =
         "\1\uffff\1\2\4\uffff\1\1\14\uffff";
     static final String DFA64_specialS =
@@ -8838,19 +8984,21 @@
     static final String[] DFA64_transitionS = {
             "\2\1\26\uffff\1\2\1\uffff\1\1",
             "",
-            "\4\1\1\uffff\1\1\1\4\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
+            "\5\1\1\uffff\1\1\1\4\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
             "\2\1\5\uffff\1\1\1\uffff\1\6\1\1\2\uffff\4\1\1\uffff\1\5\1\7"+
-            "\1\10\1\11\1\12\1\3\6\uffff\1\1\16\uffff\6\6",
-            "\1\1\1\uffff\1\13\35\uffff\1\1\10\uffff\6\1\4\uffff\1\1\20\uffff"+
+            "\1\10\1\11\1\12\1\6\1\3\6\uffff\1\1\16\uffff\6\6",
+            "\1\1\1\uffff\1\13\35\uffff\1\1\10\uffff\7\1\4\uffff\1\1\20\uffff"+
             "\6\1",
             "\1\uffff",
-            "\4\6\1\1\1\6\1\22\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
+            "\5\6\1\1\1\6\1\22\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
             "\2\6\5\uffff\1\6\1\uffff\1\1\3\uffff\4\6\1\uffff\1\15\1\16\1"+
-            "\17\1\20\1\21\1\14\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff\6\1",
+            "\17\1\20\1\21\1\1\1\14\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff"+
+            "\6\1",
             "",
-            "\4\6\1\1\1\6\1\22\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
+            "\5\6\1\1\1\6\1\22\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
             "\2\6\5\uffff\1\6\1\uffff\1\1\3\uffff\4\6\1\uffff\1\15\1\16\1"+
-            "\17\1\20\1\21\1\14\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff\6\1",
+            "\17\1\20\1\21\1\1\1\14\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff"+
+            "\6\1",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -8894,7 +9042,7 @@
             this.transition = DFA64_transition;
         }
         public String getDescription() {
-            return "()* loopback of 1398:3: ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*";
+            return "()* loopback of 1411:3: ( options {backtrack=true; } : DOUBLE_PIPE and_restr_connective[or] )*";
         }
         public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
         	int _s = s;
@@ -8923,36 +9071,82 @@
         }
     }
     static final String DFA65_eotS =
-        "\32\uffff";
+        "\70\uffff";
     static final String DFA65_eofS =
-        "\1\1\31\uffff";
+        "\1\1\13\uffff\1\4\1\uffff\5\4\45\uffff";
     static final String DFA65_minS =
-        "\1\13\1\uffff\1\4\1\10\2\4\1\uffff\1\4\22\0";
+        "\1\14\1\uffff\1\4\1\11\1\uffff\7\4\1\11\6\4\1\11\1\0\2\4\41\0";
     static final String DFA65_maxS =
-        "\1\45\1\uffff\4\121\1\uffff\1\121\22\0";
+        "\1\46\1\uffff\2\123\1\uffff\7\123\1\75\1\123\5\77\1\123\1\0\2\123"+
+        "\41\0";
     static final String DFA65_acceptS =
-        "\1\uffff\1\2\4\uffff\1\1\23\uffff";
+        "\1\uffff\1\2\2\uffff\1\1\63\uffff";
     static final String DFA65_specialS =
-        "\32\uffff}>";
+        "\24\uffff\1\0\43\uffff}>";
     static final String[] DFA65_transitionS = {
             "\2\1\26\uffff\1\1\1\uffff\1\2",
             "",
-            "\4\1\1\uffff\1\1\1\4\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6\uffff"+
-            "\2\1\5\uffff\1\1\1\uffff\1\6\1\1\2\uffff\4\1\1\uffff\1\5\1\7"+
-            "\1\10\1\11\1\12\1\3\6\uffff\1\1\16\uffff\6\6",
-            "\1\1\1\uffff\1\13\35\uffff\1\1\10\uffff\6\1\4\uffff\1\1\20\uffff"+
+            "\5\1\1\uffff\1\1\1\12\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6"+
+            "\uffff\2\1\5\uffff\1\1\1\uffff\1\4\1\1\2\uffff\4\1\1\uffff\1"+
+            "\5\1\6\1\7\1\10\1\11\1\4\1\3\6\uffff\1\1\16\uffff\6\4",
+            "\1\1\1\uffff\1\13\35\uffff\1\1\10\uffff\7\1\4\uffff\1\1\20\uffff"+
             "\6\1",
-            "\4\1\1\uffff\1\1\1\15\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6"+
-            "\uffff\2\1\5\uffff\1\1\1\uffff\1\6\1\1\2\uffff\4\1\1\uffff\1"+
-            "\16\1\17\1\20\1\21\1\22\1\14\6\uffff\1\1\16\uffff\6\6",
-            "\4\6\1\1\1\6\1\24\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
-            "\2\6\5\uffff\1\6\1\uffff\1\1\3\uffff\4\6\1\uffff\1\25\1\26\1"+
-            "\27\1\30\1\31\1\23\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff\6\1",
             "",
-            "\4\6\1\1\1\6\1\24\2\uffff\6\6\1\uffff\1\6\1\uffff\4\6\5\uffff"+
-            "\2\6\5\uffff\1\6\1\uffff\1\1\3\uffff\4\6\1\uffff\1\25\1\26\1"+
-            "\27\1\30\1\31\1\23\2\6\2\uffff\1\1\1\uffff\1\6\16\uffff\6\1",
+            "\5\4\1\1\1\4\1\15\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\16\1\17\1"+
+            "\20\1\21\1\22\1\1\1\14\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\4\1\1\1\4\1\15\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\16\1\17\1"+
+            "\20\1\21\1\22\1\1\1\14\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\4\1\1\1\4\1\15\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\16\1\17\1"+
+            "\20\1\21\1\22\1\1\1\14\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\4\1\1\1\4\1\15\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\16\1\17\1"+
+            "\20\1\21\1\22\1\1\1\14\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\4\1\1\1\4\1\15\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\16\1\17\1"+
+            "\20\1\21\1\22\1\1\1\14\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\1\1\uffff\1\1\1\24\2\uffff\6\1\3\uffff\1\1\1\uffff\1\1\6"+
+            "\uffff\2\1\5\uffff\1\1\1\uffff\1\4\1\1\2\uffff\4\1\1\uffff\1"+
+            "\25\1\26\1\27\1\30\1\31\1\4\1\23\6\uffff\1\1\16\uffff\6\4",
+            "\5\4\1\uffff\1\4\1\33\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5"+
+            "\uffff\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\34"+
+            "\1\35\1\36\1\37\1\40\1\1\1\32\2\4\4\uffff\1\4\16\uffff\6\1",
+            "\1\4\1\uffff\1\1\2\4\26\uffff\1\4\1\uffff\1\4\26\uffff\1\4",
+            "\7\4\1\42\35\4\1\43\10\4\1\52\1\53\1\54\1\55\1\56\1\57\1\41"+
+            "\25\4\1\44\1\45\1\46\1\47\1\50\1\51",
+            "\5\1\1\4\2\1\2\4\6\1\1\uffff\1\1\1\uffff\4\1\5\uffff\2\1\2\uffff"+
+            "\1\4\1\uffff\1\4\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\3\1\2\uffff"+
+            "\1\4\1\uffff\1\1",
+            "\5\1\1\4\2\1\2\4\6\1\1\uffff\1\1\1\uffff\4\1\5\uffff\2\1\2\uffff"+
+            "\1\4\1\uffff\1\4\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\3\1\2\uffff"+
+            "\1\4\1\uffff\1\1",
+            "\5\1\1\4\2\1\2\4\6\1\1\uffff\1\1\1\uffff\4\1\5\uffff\2\1\2\uffff"+
+            "\1\4\1\uffff\1\4\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\3\1\2\uffff"+
+            "\1\4\1\uffff\1\1",
+            "\5\1\1\4\2\1\2\4\6\1\1\uffff\1\1\1\uffff\4\1\5\uffff\2\1\2\uffff"+
+            "\1\4\1\uffff\1\4\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\3\1\2\uffff"+
+            "\1\4\1\uffff\1\1",
+            "\5\1\1\4\2\1\2\4\6\1\1\uffff\1\1\1\uffff\4\1\5\uffff\2\1\2\uffff"+
+            "\1\4\1\uffff\1\4\1\1\5\uffff\4\1\1\uffff\5\1\1\uffff\3\1\2\uffff"+
+            "\1\4\1\uffff\1\1",
+            "\1\1\1\uffff\1\60\35\uffff\1\1\10\uffff\7\1\4\uffff\1\1\20\uffff"+
+            "\6\1",
             "\1\uffff",
+            "\5\4\1\1\1\4\1\62\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\63\1\64\1"+
+            "\65\1\66\1\67\1\1\1\61\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
+            "\5\4\1\1\1\4\1\62\2\uffff\6\4\1\uffff\1\4\1\uffff\4\4\5\uffff"+
+            "\2\4\5\uffff\1\4\1\uffff\1\1\3\uffff\4\4\1\uffff\1\63\1\64\1"+
+            "\65\1\66\1\67\1\1\1\61\2\4\2\uffff\1\1\1\uffff\1\4\16\uffff"+
+            "\6\1",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -8969,6 +9163,22 @@
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
+            "\1\uffff",
             "\1\uffff"
     };
 
@@ -9002,333 +9212,370 @@
             this.transition = DFA65_transition;
         }
         public String getDescription() {
-            return "()* loopback of 1421:3: ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*";
+            return "()* loopback of 1434:3: ( options {backtrack=true; } : t= DOUBLE_AMPER constraint_expression[and] )*";
         }
+        public int specialStateTransition(int s, IntStream input) throws NoViableAltException {
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA65_20 = input.LA(1);
+
+                         
+                        int index65_20 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred9()) ) {s = 4;}
+
+                        else if ( (true) ) {s = 1;}
+
+                         
+                        input.seek(index65_20);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (backtracking>0) {failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 65, _s, input);
+            error(nvae);
+            throw nvae;
+        }
     }
  
 
-    public static final BitSet FOLLOW_72_in_opt_semicolon39 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_prolog_in_compilation_unit57 = new BitSet(new long[]{0x00000003FD69A260L});
-    public static final BitSet FOLLOW_statement_in_compilation_unit62 = new BitSet(new long[]{0x00000003FD69A260L});
+    public static final BitSet FOLLOW_74_in_opt_semicolon39 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_prolog_in_compilation_unit57 = new BitSet(new long[]{0x00000007FAD34460L});
+    public static final BitSet FOLLOW_statement_in_compilation_unit62 = new BitSet(new long[]{0x00000007FAD34460L});
     public static final BitSet FOLLOW_EOF_in_compilation_unit67 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_package_statement_in_prolog96 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_rule_attribute_in_statement121 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_function_import_statement_in_statement128 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_import_statement_in_statement134 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_global_in_statement140 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_function_in_statement146 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_template_in_statement160 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rule_in_statement169 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_query_in_statement181 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_PACKAGE_in_package_statement205 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_dotted_name_in_package_statement209 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_package_statement211 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IMPORT_in_import_statement242 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_import_name_in_import_statement265 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_import_statement268 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IMPORT_in_function_import_statement292 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_FUNCTION_in_function_import_statement294 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_import_name_in_function_import_statement317 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_function_import_statement320 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_import_name346 = new BitSet(new long[]{0x0000000000000102L,0x0000000000000200L});
-    public static final BitSet FOLLOW_DOT_in_import_name358 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_import_name362 = new BitSet(new long[]{0x0000000000000102L,0x0000000000000200L});
-    public static final BitSet FOLLOW_73_in_import_name386 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_GLOBAL_in_global420 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_dotted_name_in_global431 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_global442 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_global444 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUNCTION_in_function469 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_dotted_name_in_function473 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_function478 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_function487 = new BitSet(new long[]{0x207EF0418147F2F0L});
-    public static final BitSet FOLLOW_dotted_name_in_function496 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_argument_in_function501 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_function515 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_dotted_name_in_function519 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_argument_in_function524 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_function548 = new BitSet(new long[]{0x0200000000000000L});
-    public static final BitSet FOLLOW_curly_chunk_in_function554 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_argument581 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_argument587 = new BitSet(new long[]{0x1000000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_argument589 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_QUERY_in_query619 = new BitSet(new long[]{0x0000000000100080L});
-    public static final BitSet FOLLOW_name_in_query623 = new BitSet(new long[]{0x0000078000004480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_query633 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_qualified_id_in_query668 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_query673 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_query694 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_qualified_id_in_query698 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_ID_in_query703 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_query753 = new BitSet(new long[]{0x0000078000004480L});
-    public static final BitSet FOLLOW_normal_lhs_block_in_query782 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_END_in_query787 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_query789 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_TEMPLATE_in_template817 = new BitSet(new long[]{0x0000000000100080L});
-    public static final BitSet FOLLOW_name_in_template821 = new BitSet(new long[]{0x0000000000000080L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template823 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_template_slot_in_template838 = new BitSet(new long[]{0x0000000000004080L});
-    public static final BitSet FOLLOW_END_in_template853 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template855 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_qualified_id_in_template_slot901 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_template_slot917 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_template_slot919 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_in_rule950 = new BitSet(new long[]{0x0000000000100080L});
-    public static final BitSet FOLLOW_name_in_rule954 = new BitSet(new long[]{0x20000003FD6E0000L});
-    public static final BitSet FOLLOW_rule_attributes_in_rule963 = new BitSet(new long[]{0x2000000000020000L});
-    public static final BitSet FOLLOW_WHEN_in_rule975 = new BitSet(new long[]{0x2000078000000480L,0x0000000000000400L});
-    public static final BitSet FOLLOW_74_in_rule977 = new BitSet(new long[]{0x2000078000000480L});
-    public static final BitSet FOLLOW_normal_lhs_block_in_rule988 = new BitSet(new long[]{0x2000000000000000L});
-    public static final BitSet FOLLOW_rhs_chunk_in_rule998 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ATTRIBUTES_in_rule_attributes1018 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
-    public static final BitSet FOLLOW_74_in_rule_attributes1020 = new BitSet(new long[]{0x00000003FD680000L});
-    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1028 = new BitSet(new long[]{0x00000003FD680802L});
-    public static final BitSet FOLLOW_COMMA_in_rule_attributes1035 = new BitSet(new long[]{0x00000003FD680000L});
-    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1040 = new BitSet(new long[]{0x00000003FD680802L});
-    public static final BitSet FOLLOW_salience_in_rule_attribute1077 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_no_loop_in_rule_attribute1085 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_agenda_group_in_rule_attribute1094 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_duration_in_rule_attribute1103 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_activation_group_in_rule_attribute1112 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_auto_focus_in_rule_attribute1120 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_date_effective_in_rule_attribute1128 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_date_expires_in_rule_attribute1136 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_enabled_in_rule_attribute1144 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleflow_group_in_rule_attribute1152 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lock_on_active_in_rule_attribute1160 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_dialect_in_rule_attribute1167 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DATE_EFFECTIVE_in_date_effective1193 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_date_effective1195 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DATE_EXPIRES_in_date_expires1224 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_date_expires1226 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ENABLED_in_enabled1255 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_BOOL_in_enabled1257 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SALIENCE_in_salience1290 = new BitSet(new long[]{0x0000000002000400L});
-    public static final BitSet FOLLOW_INT_in_salience1301 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_salience1316 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NO_LOOP_in_no_loop1346 = new BitSet(new long[]{0x0000000000800002L});
-    public static final BitSet FOLLOW_BOOL_in_no_loop1359 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AUTO_FOCUS_in_auto_focus1394 = new BitSet(new long[]{0x0000000000800002L});
-    public static final BitSet FOLLOW_BOOL_in_auto_focus1407 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ACTIVATION_GROUP_in_activation_group1443 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_activation_group1445 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1473 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_ruleflow_group1475 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_AGENDA_GROUP_in_agenda_group1503 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_agenda_group1505 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DURATION_in_duration1533 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_INT_in_duration1535 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DIALECT_in_dialect1563 = new BitSet(new long[]{0x0000000000100000L});
-    public static final BitSet FOLLOW_STRING_in_dialect1565 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1597 = new BitSet(new long[]{0x0000000000800002L});
-    public static final BitSet FOLLOW_BOOL_in_lock_on_active1610 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_in_normal_lhs_block1649 = new BitSet(new long[]{0x0000078000000482L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs1686 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_or1711 = new BitSet(new long[]{0x0000000400000000L});
-    public static final BitSet FOLLOW_OR_in_lhs_or1713 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or1726 = new BitSet(new long[]{0x0000078000001480L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_or1737 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or1755 = new BitSet(new long[]{0x0000000C00000002L});
-    public static final BitSet FOLLOW_set_in_lhs_or1763 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_and_in_lhs_or1779 = new BitSet(new long[]{0x0000000C00000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_and1810 = new BitSet(new long[]{0x0000001000000000L});
-    public static final BitSet FOLLOW_AND_in_lhs_and1812 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1824 = new BitSet(new long[]{0x0000078000001480L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_and1834 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1852 = new BitSet(new long[]{0x0000003000000002L});
-    public static final BitSet FOLLOW_set_in_lhs_and1860 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1876 = new BitSet(new long[]{0x0000003000000002L});
-    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary1921 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_lhs_not_in_lhs_unary1939 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary1958 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_lhs_forall_in_lhs_unary1977 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_unary1994 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_unary1998 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_unary2000 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_pattern_source_in_lhs_unary2011 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_lhs_unary2023 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_pattern_source2050 = new BitSet(new long[]{0x0000004000000002L});
-    public static final BitSet FOLLOW_FROM_in_pattern_source2062 = new BitSet(new long[]{0x207FF8418147E2F0L});
-    public static final BitSet FOLLOW_accumulate_statement_in_pattern_source2118 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_collect_statement_in_pattern_source2141 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_from_statement_in_pattern_source2165 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXISTS_in_lhs_exist2208 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_exist2228 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_exist2232 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_exist2262 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_exist2312 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NOT_in_lhs_not2364 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_not2377 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_lhs_not2381 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_not2412 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_not2449 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_lhs_eval2495 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_lhs_eval2506 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FORALL_in_lhs_forall2532 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_forall2534 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2538 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2553 = new BitSet(new long[]{0x0000000000001080L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_forall2569 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_fact_binding_in_lhs_pattern2602 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_fact_in_lhs_pattern2610 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_from_source_in_from_statement2637 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ACCUMULATE_in_accumulate_statement2674 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_accumulate_statement2684 = new BitSet(new long[]{0x0000078000000480L});
-    public static final BitSet FOLLOW_lhs_or_in_accumulate_statement2688 = new BitSet(new long[]{0x0000100000000880L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2690 = new BitSet(new long[]{0x0000100000000080L});
-    public static final BitSet FOLLOW_INIT_in_accumulate_statement2708 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2721 = new BitSet(new long[]{0x0000200000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2723 = new BitSet(new long[]{0x0000200000000000L});
-    public static final BitSet FOLLOW_ACTION_in_accumulate_statement2734 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2738 = new BitSet(new long[]{0x0000C00000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2740 = new BitSet(new long[]{0x0000C00000000000L});
-    public static final BitSet FOLLOW_REVERSE_in_accumulate_statement2753 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2757 = new BitSet(new long[]{0x0000800000000800L});
-    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2759 = new BitSet(new long[]{0x0000800000000000L});
-    public static final BitSet FOLLOW_RESULT_in_accumulate_statement2776 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2780 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_ID_in_accumulate_statement2806 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2810 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_accumulate_statement2827 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_from_source2855 = new BitSet(new long[]{0x0000000000000502L});
-    public static final BitSet FOLLOW_paren_chunk_in_from_source2883 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_expression_chain_in_from_source2896 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOT_in_expression_chain2931 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_expression_chain2935 = new BitSet(new long[]{0x0800000000000502L});
-    public static final BitSet FOLLOW_square_chunk_in_expression_chain2966 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_paren_chunk_in_expression_chain2999 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_expression_chain_in_expression_chain3014 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_COLLECT_in_collect_statement3065 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_collect_statement3075 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_pattern_source_in_collect_statement3079 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_collect_statement3081 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_fact_binding3113 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
-    public static final BitSet FOLLOW_74_in_fact_binding3115 = new BitSet(new long[]{0x0000000000000480L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3129 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_fact_binding3145 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3149 = new BitSet(new long[]{0x0000000C00001000L});
-    public static final BitSet FOLLOW_set_in_fact_binding3162 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_fact_in_fact_binding3174 = new BitSet(new long[]{0x0000000C00001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact_binding3192 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_qualified_id_in_fact3247 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_fact3257 = new BitSet(new long[]{0x207EF2418147F6F0L});
-    public static final BitSet FOLLOW_constraints_in_fact3269 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact3276 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EOF_in_fact3285 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_constraint_in_constraints3303 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_COMMA_in_constraints3310 = new BitSet(new long[]{0x207EF2418147E6F0L});
-    public static final BitSet FOLLOW_constraint_in_constraints3319 = new BitSet(new long[]{0x0000000000000802L});
-    public static final BitSet FOLLOW_or_constr_in_constraint3352 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_and_constr_in_or_constr3375 = new BitSet(new long[]{0x0000000800000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_constr3383 = new BitSet(new long[]{0x207EF2418147E6F0L});
-    public static final BitSet FOLLOW_and_constr_in_or_constr3392 = new BitSet(new long[]{0x0000000800000002L});
-    public static final BitSet FOLLOW_unary_constr_in_and_constr3424 = new BitSet(new long[]{0x0000002000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_constr3432 = new BitSet(new long[]{0x207EF2418147E6F0L});
-    public static final BitSet FOLLOW_unary_constr_in_and_constr3441 = new BitSet(new long[]{0x0000002000000002L});
-    public static final BitSet FOLLOW_field_constraint_in_unary_constr3469 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_unary_constr3477 = new BitSet(new long[]{0x207EF2418147E6F0L});
-    public static final BitSet FOLLOW_or_constr_in_unary_constr3479 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_unary_constr3482 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_unary_constr3488 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_predicate_in_unary_constr3490 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_field_constraint3529 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
-    public static final BitSet FOLLOW_74_in_field_constraint3531 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_accessor_path_in_field_constraint3550 = new BitSet(new long[]{0x007E010000000402L,0x000000000003F800L});
-    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint3578 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_75_in_field_constraint3598 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_predicate_in_field_constraint3600 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_accessor_path_in_field_constraint3626 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint3648 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3699 = new BitSet(new long[]{0x0000000800000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_restr_connective3723 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3734 = new BitSet(new long[]{0x0000000800000002L});
-    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3766 = new BitSet(new long[]{0x0000002000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_restr_connective3787 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3798 = new BitSet(new long[]{0x0000002000000002L});
-    public static final BitSet FOLLOW_compound_operator_in_constraint_expression3835 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_operator_in_constraint_expression3842 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_constraint_expression3849 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_or_restr_connective_in_constraint_expression3858 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_constraint_expression3864 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_76_in_simple_operator3895 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_77_in_simple_operator3903 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_78_in_simple_operator3911 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_79_in_simple_operator3919 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_80_in_simple_operator3927 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_81_in_simple_operator3935 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_CONTAINS_in_simple_operator3943 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator3951 = new BitSet(new long[]{0x0002000000000000L});
-    public static final BitSet FOLLOW_CONTAINS_in_simple_operator3955 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_EXCLUDES_in_simple_operator3963 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_MATCHES_in_simple_operator3971 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_SOUNDSLIKE_in_simple_operator3979 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator3987 = new BitSet(new long[]{0x0008000000000000L});
-    public static final BitSet FOLLOW_MATCHES_in_simple_operator3991 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator3999 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_NOT_in_simple_operator4007 = new BitSet(new long[]{0x0020000000000000L});
-    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator4011 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_expression_value_in_simple_operator4025 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IN_in_compound_operator4055 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_NOT_in_compound_operator4067 = new BitSet(new long[]{0x0040000000000000L});
-    public static final BitSet FOLLOW_IN_in_compound_operator4069 = new BitSet(new long[]{0x0000000000000400L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_compound_operator4084 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_expression_value_in_compound_operator4088 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_COMMA_in_compound_operator4095 = new BitSet(new long[]{0x21FEF04183D7E6F0L});
-    public static final BitSet FOLLOW_expression_value_in_compound_operator4099 = new BitSet(new long[]{0x0000000000001800L});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_compound_operator4108 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_accessor_path_in_expression_value4142 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_literal_constraint_in_expression_value4162 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_expression_value4176 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_literal_constraint4219 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INT_in_literal_constraint4230 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FLOAT_in_literal_constraint4243 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BOOL_in_literal_constraint4254 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NULL_in_literal_constraint4266 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_paren_chunk_in_predicate4304 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_CURLY_in_curly_chunk4322 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_set_in_curly_chunk4326 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_curly_chunk_in_curly_chunk4335 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_RIGHT_CURLY_in_curly_chunk4340 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_paren_chunk4354 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_set_in_paren_chunk4358 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_paren_chunk_in_paren_chunk4367 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_RIGHT_PAREN_in_paren_chunk4372 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_square_chunk4385 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_set_in_square_chunk4389 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_square_chunk_in_square_chunk4398 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_square_chunk4403 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_qualified_id4432 = new BitSet(new long[]{0x0800000000000102L});
-    public static final BitSet FOLLOW_DOT_in_qualified_id4438 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_qualified_id4440 = new BitSet(new long[]{0x0800000000000102L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_qualified_id4449 = new BitSet(new long[]{0x1000000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_qualified_id4451 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_identifier_in_dotted_name4485 = new BitSet(new long[]{0x0800000000000102L});
-    public static final BitSet FOLLOW_DOT_in_dotted_name4491 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_identifier_in_dotted_name4495 = new BitSet(new long[]{0x0800000000000102L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_dotted_name4504 = new BitSet(new long[]{0x1000000000000000L});
-    public static final BitSet FOLLOW_RIGHT_SQUARE_in_dotted_name4506 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_accessor_element_in_accessor_path4540 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_DOT_in_accessor_path4546 = new BitSet(new long[]{0x207EF0418147E2F0L});
-    public static final BitSet FOLLOW_accessor_element_in_accessor_path4550 = new BitSet(new long[]{0x0000000000000102L});
-    public static final BitSet FOLLOW_identifier_in_accessor_element4588 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_square_chunk_in_accessor_element4595 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_THEN_in_rhs_chunk4616 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_set_in_rhs_chunk4624 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x000000000003FFFFL});
-    public static final BitSet FOLLOW_END_in_rhs_chunk4648 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000100L});
-    public static final BitSet FOLLOW_opt_semicolon_in_rhs_chunk4650 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ID_in_name4684 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_name4692 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_event_import_statement_in_statement134 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_import_statement_in_statement139 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_global_in_statement145 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_function_in_statement151 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_template_in_statement165 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_rule_in_statement174 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_query_in_statement186 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_PACKAGE_in_package_statement212 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_dotted_name_in_package_statement216 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_package_statement218 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_IMPORT_in_import_statement249 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_import_name_in_import_statement272 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_import_statement275 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_IMPORT_in_function_import_statement299 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_FUNCTION_in_function_import_statement301 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_import_name_in_function_import_statement324 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_function_import_statement327 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_IMPORT_in_event_import_statement351 = new BitSet(new long[]{0x0000000000000080L});
+    public static final BitSet FOLLOW_EVENT_in_event_import_statement353 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_import_name_in_event_import_statement376 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_event_import_statement379 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_import_name405 = new BitSet(new long[]{0x0000000000000202L,0x0000000000000800L});
+    public static final BitSet FOLLOW_DOT_in_import_name417 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_import_name421 = new BitSet(new long[]{0x0000000000000202L,0x0000000000000800L});
+    public static final BitSet FOLLOW_75_in_import_name445 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_GLOBAL_in_global479 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_dotted_name_in_global490 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_global501 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_global503 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FUNCTION_in_function528 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_dotted_name_in_function532 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_function537 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_function546 = new BitSet(new long[]{0x817DE083028FE5F0L});
+    public static final BitSet FOLLOW_dotted_name_in_function555 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_argument_in_function560 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_COMMA_in_function574 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_dotted_name_in_function578 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_argument_in_function583 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_function607 = new BitSet(new long[]{0x0800000000000000L});
+    public static final BitSet FOLLOW_curly_chunk_in_function613 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_identifier_in_argument640 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_argument646 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_argument648 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_QUERY_in_query678 = new BitSet(new long[]{0x0000000000200100L});
+    public static final BitSet FOLLOW_name_in_query682 = new BitSet(new long[]{0x00000F0000008900L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_query692 = new BitSet(new long[]{0x0000000000002100L});
+    public static final BitSet FOLLOW_qualified_id_in_query727 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_ID_in_query732 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_COMMA_in_query753 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_qualified_id_in_query757 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_ID_in_query762 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_query812 = new BitSet(new long[]{0x00000F0000008900L});
+    public static final BitSet FOLLOW_normal_lhs_block_in_query841 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_END_in_query846 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_query848 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_TEMPLATE_in_template876 = new BitSet(new long[]{0x0000000000200100L});
+    public static final BitSet FOLLOW_name_in_template880 = new BitSet(new long[]{0x0000000000000100L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_template882 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_template_slot_in_template897 = new BitSet(new long[]{0x0000000000008100L});
+    public static final BitSet FOLLOW_END_in_template912 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_template914 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_qualified_id_in_template_slot960 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_template_slot976 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_template_slot978 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_in_rule1009 = new BitSet(new long[]{0x0000000000200100L});
+    public static final BitSet FOLLOW_name_in_rule1013 = new BitSet(new long[]{0x80000007FADC0000L});
+    public static final BitSet FOLLOW_rule_attributes_in_rule1022 = new BitSet(new long[]{0x8000000000040000L});
+    public static final BitSet FOLLOW_WHEN_in_rule1034 = new BitSet(new long[]{0x80000F0000000900L,0x0000000000001000L});
+    public static final BitSet FOLLOW_76_in_rule1036 = new BitSet(new long[]{0x80000F0000000900L});
+    public static final BitSet FOLLOW_normal_lhs_block_in_rule1047 = new BitSet(new long[]{0x8000000000000000L});
+    public static final BitSet FOLLOW_rhs_chunk_in_rule1057 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ATTRIBUTES_in_rule_attributes1077 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_76_in_rule_attributes1079 = new BitSet(new long[]{0x00000007FAD00000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1087 = new BitSet(new long[]{0x00000007FAD01002L});
+    public static final BitSet FOLLOW_COMMA_in_rule_attributes1094 = new BitSet(new long[]{0x00000007FAD00000L});
+    public static final BitSet FOLLOW_rule_attribute_in_rule_attributes1099 = new BitSet(new long[]{0x00000007FAD01002L});
+    public static final BitSet FOLLOW_salience_in_rule_attribute1136 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_no_loop_in_rule_attribute1144 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_agenda_group_in_rule_attribute1153 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_duration_in_rule_attribute1162 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_activation_group_in_rule_attribute1171 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_auto_focus_in_rule_attribute1179 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_effective_in_rule_attribute1187 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_date_expires_in_rule_attribute1195 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_enabled_in_rule_attribute1203 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleflow_group_in_rule_attribute1211 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lock_on_active_in_rule_attribute1219 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_dialect_in_rule_attribute1226 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DATE_EFFECTIVE_in_date_effective1252 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_date_effective1254 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DATE_EXPIRES_in_date_expires1283 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_date_expires1285 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ENABLED_in_enabled1314 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_BOOL_in_enabled1316 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SALIENCE_in_salience1349 = new BitSet(new long[]{0x0000000004000800L});
+    public static final BitSet FOLLOW_INT_in_salience1360 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_in_salience1375 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NO_LOOP_in_no_loop1405 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_BOOL_in_no_loop1418 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AUTO_FOCUS_in_auto_focus1453 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_BOOL_in_auto_focus1466 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ACTIVATION_GROUP_in_activation_group1502 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_activation_group1504 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULEFLOW_GROUP_in_ruleflow_group1532 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_ruleflow_group1534 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_AGENDA_GROUP_in_agenda_group1562 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_agenda_group1564 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DURATION_in_duration1592 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_INT_in_duration1594 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DIALECT_in_dialect1622 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_STRING_in_dialect1624 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LOCK_ON_ACTIVE_in_lock_on_active1656 = new BitSet(new long[]{0x0000000001000002L});
+    public static final BitSet FOLLOW_BOOL_in_lock_on_active1669 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_in_normal_lhs_block1708 = new BitSet(new long[]{0x00000F0000000902L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs1745 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_or1770 = new BitSet(new long[]{0x0000000800000000L});
+    public static final BitSet FOLLOW_OR_in_lhs_or1772 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1785 = new BitSet(new long[]{0x00000F0000002900L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_or1796 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1814 = new BitSet(new long[]{0x0000001800000002L});
+    public static final BitSet FOLLOW_set_in_lhs_or1822 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_and_in_lhs_or1838 = new BitSet(new long[]{0x0000001800000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_and1869 = new BitSet(new long[]{0x0000002000000000L});
+    public static final BitSet FOLLOW_AND_in_lhs_and1871 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1883 = new BitSet(new long[]{0x00000F0000002900L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_and1893 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1911 = new BitSet(new long[]{0x0000006000000002L});
+    public static final BitSet FOLLOW_set_in_lhs_and1919 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_unary_in_lhs_and1935 = new BitSet(new long[]{0x0000006000000002L});
+    public static final BitSet FOLLOW_lhs_exist_in_lhs_unary1980 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_lhs_not_in_lhs_unary1998 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_lhs_eval_in_lhs_unary2017 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_lhs_forall_in_lhs_unary2036 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_unary2053 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_unary2057 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_unary2059 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_pattern_source_in_lhs_unary2070 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_lhs_unary2082 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_pattern_source2109 = new BitSet(new long[]{0x0000008000000002L});
+    public static final BitSet FOLLOW_FROM_in_pattern_source2121 = new BitSet(new long[]{0x817FF083028FC5F0L});
+    public static final BitSet FOLLOW_accumulate_statement_in_pattern_source2177 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_collect_statement_in_pattern_source2200 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_from_statement_in_pattern_source2224 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EXISTS_in_lhs_exist2267 = new BitSet(new long[]{0x0000000000000900L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_exist2287 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_exist2291 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_exist2321 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_exist2371 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NOT_in_lhs_not2423 = new BitSet(new long[]{0x0000000000000900L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_not2436 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_or_in_lhs_not2440 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_not2471 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_not2508 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EVAL_in_lhs_eval2554 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_lhs_eval2565 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FORALL_in_lhs_forall2591 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_lhs_forall2593 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2597 = new BitSet(new long[]{0x0000000000002100L});
+    public static final BitSet FOLLOW_lhs_pattern_in_lhs_forall2612 = new BitSet(new long[]{0x0000000000002100L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_lhs_forall2628 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_binding_in_lhs_pattern2661 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_fact_in_lhs_pattern2669 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_from_source_in_from_statement2696 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ACCUMULATE_in_accumulate_statement2733 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_accumulate_statement2743 = new BitSet(new long[]{0x00000F0000000900L});
+    public static final BitSet FOLLOW_lhs_or_in_accumulate_statement2747 = new BitSet(new long[]{0x0000200000001100L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2749 = new BitSet(new long[]{0x0000200000000100L});
+    public static final BitSet FOLLOW_INIT_in_accumulate_statement2767 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2780 = new BitSet(new long[]{0x0000400000001000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2782 = new BitSet(new long[]{0x0000400000000000L});
+    public static final BitSet FOLLOW_ACTION_in_accumulate_statement2793 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2797 = new BitSet(new long[]{0x0001800000001000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2799 = new BitSet(new long[]{0x0001800000000000L});
+    public static final BitSet FOLLOW_REVERSE_in_accumulate_statement2812 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2816 = new BitSet(new long[]{0x0001000000001000L});
+    public static final BitSet FOLLOW_COMMA_in_accumulate_statement2818 = new BitSet(new long[]{0x0001000000000000L});
+    public static final BitSet FOLLOW_RESULT_in_accumulate_statement2835 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2839 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_ID_in_accumulate_statement2865 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_paren_chunk_in_accumulate_statement2869 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_accumulate_statement2886 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_identifier_in_from_source2914 = new BitSet(new long[]{0x0000000000000A02L});
+    public static final BitSet FOLLOW_paren_chunk_in_from_source2942 = new BitSet(new long[]{0x0000000000000202L});
+    public static final BitSet FOLLOW_expression_chain_in_from_source2955 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOT_in_expression_chain2990 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_expression_chain2994 = new BitSet(new long[]{0x2000000000000A02L});
+    public static final BitSet FOLLOW_square_chunk_in_expression_chain3025 = new BitSet(new long[]{0x0000000000000202L});
+    public static final BitSet FOLLOW_paren_chunk_in_expression_chain3058 = new BitSet(new long[]{0x0000000000000202L});
+    public static final BitSet FOLLOW_expression_chain_in_expression_chain3073 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_COLLECT_in_collect_statement3124 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_collect_statement3134 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_pattern_source_in_collect_statement3138 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_collect_statement3140 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_fact_binding3172 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_76_in_fact_binding3174 = new BitSet(new long[]{0x0000000000000900L});
+    public static final BitSet FOLLOW_fact_in_fact_binding3188 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_fact_binding3204 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_fact_in_fact_binding3208 = new BitSet(new long[]{0x0000001800002000L});
+    public static final BitSet FOLLOW_set_in_fact_binding3221 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_fact_in_fact_binding3233 = new BitSet(new long[]{0x0000001800002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact_binding3251 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_qualified_id_in_fact3306 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_fact3316 = new BitSet(new long[]{0x817DE483028FEDF0L});
+    public static final BitSet FOLLOW_constraints_in_fact3328 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_fact3335 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EOF_in_fact3344 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_constraint_in_constraints3362 = new BitSet(new long[]{0x0000000000001002L});
+    public static final BitSet FOLLOW_COMMA_in_constraints3369 = new BitSet(new long[]{0x817DE483028FCDF0L});
+    public static final BitSet FOLLOW_constraint_in_constraints3378 = new BitSet(new long[]{0x0000000000001002L});
+    public static final BitSet FOLLOW_or_constr_in_constraint3411 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_constr_in_or_constr3434 = new BitSet(new long[]{0x0000001000000002L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_constr3442 = new BitSet(new long[]{0x817DE483028FCDF0L});
+    public static final BitSet FOLLOW_and_constr_in_or_constr3451 = new BitSet(new long[]{0x0000001000000002L});
+    public static final BitSet FOLLOW_unary_constr_in_and_constr3483 = new BitSet(new long[]{0x0000004000000002L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_constr3491 = new BitSet(new long[]{0x817DE483028FCDF0L});
+    public static final BitSet FOLLOW_unary_constr_in_and_constr3500 = new BitSet(new long[]{0x0000004000000002L});
+    public static final BitSet FOLLOW_field_constraint_in_unary_constr3528 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_unary_constr3536 = new BitSet(new long[]{0x817DE483028FCDF0L});
+    public static final BitSet FOLLOW_or_constr_in_unary_constr3538 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_unary_constr3541 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EVAL_in_unary_constr3547 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_predicate_in_unary_constr3549 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_field_constraint3588 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_76_in_field_constraint3590 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_accessor_path_in_field_constraint3609 = new BitSet(new long[]{0x01FC020000000802L,0x00000000000FE000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint3623 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_77_in_field_constraint3638 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_predicate_in_field_constraint3640 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accessor_path_in_field_constraint3666 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_field_constraint3675 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3722 = new BitSet(new long[]{0x0000001000000002L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_or_restr_connective3745 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_and_restr_connective_in_or_restr_connective3756 = new BitSet(new long[]{0x0000001000000002L});
+    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3788 = new BitSet(new long[]{0x0000004000000002L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_and_restr_connective3808 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_constraint_expression_in_and_restr_connective3819 = new BitSet(new long[]{0x0000004000000002L});
+    public static final BitSet FOLLOW_compound_operator_in_constraint_expression3856 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_operator_in_constraint_expression3863 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_constraint_expression3871 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_or_restr_connective_in_constraint_expression3880 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_constraint_expression3885 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_78_in_simple_operator3916 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_79_in_simple_operator3924 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_80_in_simple_operator3932 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_81_in_simple_operator3940 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_82_in_simple_operator3948 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_83_in_simple_operator3956 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_CONTAINS_in_simple_operator3984 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_NOT_in_simple_operator4012 = new BitSet(new long[]{0x0004000000000000L});
+    public static final BitSet FOLLOW_CONTAINS_in_simple_operator4016 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_EXCLUDES_in_simple_operator4044 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_MATCHES_in_simple_operator4072 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_SOUNDSLIKE_in_simple_operator4100 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_NOT_in_simple_operator4128 = new BitSet(new long[]{0x0010000000000000L});
+    public static final BitSet FOLLOW_MATCHES_in_simple_operator4132 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator4160 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_NOT_in_simple_operator4188 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_MEMBEROF_in_simple_operator4192 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_TILDE_in_simple_operator4198 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_ID_in_simple_operator4202 = new BitSet(new long[]{0xA77DE08307AFCDF0L});
+    public static final BitSet FOLLOW_square_chunk_in_simple_operator4206 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_NOT_in_simple_operator4215 = new BitSet(new long[]{0x0080000000000000L});
+    public static final BitSet FOLLOW_TILDE_in_simple_operator4217 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_ID_in_simple_operator4221 = new BitSet(new long[]{0xA77DE08307AFCDF0L});
+    public static final BitSet FOLLOW_square_chunk_in_simple_operator4225 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_expression_value_in_simple_operator4240 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_IN_in_compound_operator4270 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_NOT_in_compound_operator4282 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_IN_in_compound_operator4284 = new BitSet(new long[]{0x0000000000000800L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_compound_operator4299 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_expression_value_in_compound_operator4303 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_COMMA_in_compound_operator4310 = new BitSet(new long[]{0x877DE08307AFCDF0L});
+    public static final BitSet FOLLOW_expression_value_in_compound_operator4314 = new BitSet(new long[]{0x0000000000003000L});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_compound_operator4323 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_accessor_path_in_expression_value4357 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_literal_constraint_in_expression_value4377 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_in_expression_value4391 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_literal_constraint4434 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_INT_in_literal_constraint4445 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FLOAT_in_literal_constraint4458 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_BOOL_in_literal_constraint4469 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NULL_in_literal_constraint4481 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_paren_chunk_in_predicate4519 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_CURLY_in_curly_chunk4537 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_set_in_curly_chunk4541 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_curly_chunk_in_curly_chunk4550 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_RIGHT_CURLY_in_curly_chunk4555 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_paren_chunk4569 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_set_in_paren_chunk4573 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_paren_chunk_in_paren_chunk4582 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_RIGHT_PAREN_in_paren_chunk4587 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_square_chunk4600 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_set_in_square_chunk4604 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_square_chunk_in_square_chunk4613 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_square_chunk4618 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_qualified_id4647 = new BitSet(new long[]{0x2000000000000202L});
+    public static final BitSet FOLLOW_DOT_in_qualified_id4653 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_qualified_id4655 = new BitSet(new long[]{0x2000000000000202L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_qualified_id4664 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_qualified_id4666 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_identifier_in_dotted_name4700 = new BitSet(new long[]{0x2000000000000202L});
+    public static final BitSet FOLLOW_DOT_in_dotted_name4706 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_identifier_in_dotted_name4710 = new BitSet(new long[]{0x2000000000000202L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_dotted_name4719 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_RIGHT_SQUARE_in_dotted_name4721 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_accessor_element_in_accessor_path4755 = new BitSet(new long[]{0x0000000000000202L});
+    public static final BitSet FOLLOW_DOT_in_accessor_path4761 = new BitSet(new long[]{0x817DE083028FC5F0L});
+    public static final BitSet FOLLOW_accessor_element_in_accessor_path4765 = new BitSet(new long[]{0x0000000000000202L});
+    public static final BitSet FOLLOW_identifier_in_accessor_element4803 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_square_chunk_in_accessor_element4810 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_THEN_in_rhs_chunk4831 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_set_in_rhs_chunk4839 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x00000000000FFFFFL});
+    public static final BitSet FOLLOW_END_in_rhs_chunk4863 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
+    public static final BitSet FOLLOW_opt_semicolon_in_rhs_chunk4865 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_name4899 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_name4907 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_identifier0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXISTS_in_synpred11913 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NOT_in_synpred21931 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EVAL_in_synpred31950 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FORALL_in_synpred41969 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred51988 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_SQUARE_in_synpred62958 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred72991 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOUBLE_PIPE_in_synpred83723 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_and_restr_connective_in_synpred83734 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOUBLE_AMPER_in_synpred93787 = new BitSet(new long[]{0x007E010000000400L,0x000000000003F000L});
-    public static final BitSet FOLLOW_constraint_expression_in_synpred93798 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EXISTS_in_synpred11972 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NOT_in_synpred21990 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_EVAL_in_synpred32009 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_FORALL_in_synpred42028 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred52047 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_SQUARE_in_synpred63017 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFT_PAREN_in_synpred73050 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_PIPE_in_synpred83745 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_and_restr_connective_in_synpred83756 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOUBLE_AMPER_in_synpred93808 = new BitSet(new long[]{0x01FC020000000800L,0x00000000000FC000L});
+    public static final BitSet FOLLOW_constraint_expression_in_synpred93819 = new BitSet(new long[]{0x0000000000000002L});
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/DrlDumper.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -514,8 +514,8 @@
         String importList = "";
 
         for ( final Iterator it = imports.iterator(); it.hasNext(); ) {
-            final String importString = ((ImportDescr) it.next()).getTarget();
-            final String importTemplate = "import " + importString + ";" + DrlDumper.eol;
+            final ImportDescr importDescr = (ImportDescr) it.next(); 
+            final String importTemplate = "import " + ( importDescr.isEvent() ? "event " : "" ) + importDescr.getTarget() + ";" + DrlDumper.eol;
             importList += importTemplate;
         }
         return importList + DrlDumper.eol;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -55,7 +55,7 @@
     }
 
     public void visitVariableRestrictionDescr(final VariableRestrictionDescr descr) {
-        this.template = processRestriction( descr.getEvaluator(), descr.getIdentifier() );
+        this.template = processRestriction( descr.getEvaluator(), descr.isNegated(), descr.getIdentifier() );
     }
 
     public void visitFieldBindingDescr(final FieldBindingDescr descr) {
@@ -75,11 +75,11 @@
         } else if( descr.getType() == LiteralRestrictionDescr.TYPE_STRING ) {
             text = "\"" + text + "\"";
         }
-        this.template = processRestriction( descr.getEvaluator(), text );
+        this.template = processRestriction( descr.getEvaluator(), descr.isNegated(), text );
     }
 
     public void visitQualifiedIdentifierRestrictionDescr(final QualifiedIdentifierRestrictionDescr descr) {
-        this.template = processRestriction( descr.getEvaluator(), descr.getText() );
+        this.template = processRestriction( descr.getEvaluator(), descr.isNegated(), descr.getText() );
     }
 
     public void visitRestrictionConnectiveDescr(final RestrictionConnectiveDescr descr) {
@@ -91,7 +91,7 @@
     }
 
     public void visitReturnValueRestrictionDescr(final ReturnValueRestrictionDescr descr) {
-        this.template = processRestriction( descr.getEvaluator(), "( "+descr.getContent().toString()+" )" );
+        this.template = processRestriction( descr.getEvaluator(), descr.isNegated(),  "( "+descr.getContent().toString()+" )" );
     }
 
     private String processFieldConstraint(final RestrictionConnectiveDescr restriction) {
@@ -115,33 +115,34 @@
     }
 
     private String processRestriction(String evaluator,
+                                      boolean isNegated,
                                       String value) {
-        Operator op = Operator.determineOperator( evaluator );
-        if( op == Operator.MEMBEROF ) {
+        Operator op = Operator.determineOperator( evaluator, isNegated );
+        if( op == Operator.determineOperator( "memberOf", false ) ) {
             evaluator = "contains";
             return evaluatorPrefix( evaluator ) + 
                    value + " " + 
                    evaluator( evaluator ) + " " + 
                    this.fieldName + evaluatorSufix( evaluator );
-        } else if(op == Operator.NOTMEMBEROF) {
+        } else if(op == Operator.determineOperator( "memberOf", true )) {
             evaluator = "not contains";
             return evaluatorPrefix( evaluator ) + 
                    value + " " + 
                    evaluator( evaluator ) + " " + 
                    this.fieldName + evaluatorSufix( evaluator );
-        } else if(op == Operator.EXCLUDES) {
+        } else if(op == Operator.determineOperator( "excludes", false ) ) {
             evaluator = "not contains";
             return evaluatorPrefix( evaluator ) + 
                    this.fieldName + " " + 
                    evaluator( evaluator ) + " " + 
                    value + evaluatorSufix( evaluator );
-        } else if(op == Operator.MATCHES) {
+        } else if(op == Operator.determineOperator( "matches", false )) {
             evaluator = "~=";
             return evaluatorPrefix( evaluator ) + 
                    this.fieldName + " " + 
                    evaluator( evaluator ) + " " + 
                    value.replaceAll( "\\\\", "\\\\\\\\" ) + evaluatorSufix( evaluator );
-        } else if(op == Operator.NOT_MATCHES) {
+        } else if(op == Operator.determineOperator( "matches", true )) {
             evaluator = "not ~=";
             return evaluatorPrefix( evaluator ) + 
                    this.fieldName + " " + 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/DescrFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -42,6 +42,10 @@
         return new FunctionImportDescr();
     }
 
+    public ImportDescr createEventImport() {
+        return new ImportDescr( true ); // import is an event
+    }
+
     public QueryDescr createQuery(final String queryName) {
         return new QueryDescr( queryName,
                                "" );

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/EvaluatorBasedRestrictionDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 1, 2007
+ */
+package org.drools.lang.descr;
+
+/**
+ * This is a super class for all restrictions that are based on
+ * evaluators.
+ * 
+ * @author etirelli
+ */
+public class EvaluatorBasedRestrictionDescr extends RestrictionDescr {
+
+    private static final long serialVersionUID = -9051550222783766557L;
+
+    private String            evaluator;
+    private boolean           negated;
+    private String            parameterText;
+
+    /**
+     * Creates a new EvaluatorBasedRestriction
+     * 
+     * @param evaluator the evaluator ID to be used in this restriction
+     * @param isNegated true if the evaluator is boolean negated
+     * @param parameterText the parameter text, in case there is any. null otherwise.
+     */
+    public EvaluatorBasedRestrictionDescr(final String evaluator,
+                                          final boolean isNegated,
+                                          final String parameterText) {
+        this.evaluator = evaluator;
+        this.negated = isNegated;
+        this.parameterText = parameterText;
+
+    }
+
+    /**
+     * Returns the evaluator ID for this restriction
+     * @return
+     */
+    public String getEvaluator() {
+        return this.evaluator;
+    }
+
+    /**
+     * Returns true if this evaluator is boolean negated.
+     * Example: "contains" is boolean negated if you want to check the elements that are not contained ("not contains")
+     * 
+     * @return the negated
+     */
+    public boolean isNegated() {
+        return negated;
+    }
+
+    /**
+     * In case there is any parameter text, this method returns it. Returns null otherwise.
+     * A parameter text is evaluator parameters like "after[1,10]". In the previous example,
+     * the parameter text will be "1,10".
+     * 
+     * @return the parameterText
+     */
+    public String getParameterText() {
+        return parameterText;
+    }
+    
+    public String toString() {
+        return ( this.isNegated() ? "not " : "" ) + this.getEvaluator() + ( this.getParameterText() != null ? "["+this.getParameterText()+"]" : "");
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ForallDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ForallDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ForallDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -28,14 +28,14 @@
     implements
     ConditionalElementDescr {
 
-    private static final long serialVersionUID = 400L;
+    private static final long   serialVersionUID = 400L;
 
-    private static final String BASE_IDENTIFIER = "$__forallBaseIdentifier";
+    private static final String BASE_IDENTIFIER  = "$__forallBaseIdentifier";
 
-    private List              patterns;
+    private List<BaseDescr>     patterns;
 
     public ForallDescr() {
-        this.patterns = new ArrayList( 2 );
+        this.patterns = new ArrayList<BaseDescr>( 2 );
     }
 
     /* (non-Javadoc)
@@ -45,10 +45,11 @@
         // cast to make sure we are adding a pattern descriptor
         this.patterns.add( baseDescr );
     }
-    
-    public void insertBeforeLast(final Class clazz ,final BaseDescr baseDescr ) { 
+
+    public void insertBeforeLast(final Class clazz,
+                                 final BaseDescr baseDescr) {
         throw new UnsupportedOperationException( "Can't add descriptors to " + this.getClass().getName() );
-    }    
+    }
 
     /* (non-Javadoc)
      * @see org.drools.lang.descr.ConditionalElementDescr#getDescrs()
@@ -62,9 +63,9 @@
      * @return
      */
     public PatternDescr getBasePattern() {
-        if( this.patterns.size() > 1 ) {
+        if ( this.patterns.size() > 1 ) {
             return (PatternDescr) this.patterns.get( 0 );
-        } else if( this.patterns.size() == 1 ) {
+        } else if ( this.patterns.size() == 1 ) {
             // in case there is only one pattern, we do a rewrite, so:
             // forall( Cheese( type == "stilton" ) )
             // becomes
@@ -83,18 +84,21 @@
      * @return
      */
     public List getRemainingPatterns() {
-        if( this.patterns.size() > 1 ) {
+        if ( this.patterns.size() > 1 ) {
             return this.patterns.subList( 1,
                                           this.patterns.size() );
-        } else if( this.patterns.size() == 1 ) {
+        } else if ( this.patterns.size() == 1 ) {
             // in case there is only one pattern, we do a rewrite, so:
             // forall( Cheese( type == "stilton" ) )
             // becomes
             // forall( BASE_IDENTIFIER : Cheese() Cheese( this == BASE_IDENTIFIER, type == "stilton" ) )
             PatternDescr original = (PatternDescr) this.patterns.get( 0 );
             PatternDescr remaining = (PatternDescr) original.clone();
-            VariableRestrictionDescr restr = new VariableRestrictionDescr( "==", BASE_IDENTIFIER );
-            FieldConstraintDescr constr = new FieldConstraintDescr("this");
+            VariableRestrictionDescr restr = new VariableRestrictionDescr( "==",
+                                                                           false,
+                                                                           null,
+                                                                           BASE_IDENTIFIER );
+            FieldConstraintDescr constr = new FieldConstraintDescr( "this" );
             constr.addRestriction( restr );
             remaining.addConstraint( constr );
             return Collections.singletonList( remaining );
@@ -103,6 +107,6 @@
     }
 
     public void addOrMerge(BaseDescr baseDescr) {
-        this.patterns.add( baseDescr );        
+        this.patterns.add( baseDescr );
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ImportDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ImportDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ImportDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -24,12 +24,23 @@
 
     private static final long serialVersionUID = 400L;
     private String            target;
+    private boolean           event;
 
     public ImportDescr() {
+        this( null, false );
     }
 
     public ImportDescr(final String clazzName) {
+        this( clazzName, false );
+    }
+
+    public ImportDescr(final boolean isEvent) {
+        this( null, isEvent );
+    }
+
+    public ImportDescr(final String clazzName, final boolean isEvent ) {
         this.target = clazzName;
+        this.event = isEvent;
     }
 
     public String getTarget() {
@@ -79,4 +90,8 @@
         return "import " + this.target;
     }
 
+    public boolean isEvent() {
+        return this.event;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/LiteralRestrictionDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -24,64 +24,71 @@
  * a constraint on a single field of a pattern. 
  * The "text" contains the content. 
  */
-public class LiteralRestrictionDescr extends RestrictionDescr {
+public class LiteralRestrictionDescr extends EvaluatorBasedRestrictionDescr {
     public static final int   TYPE_NULL        = 1;
     public static final int   TYPE_NUMBER      = 2;
     public static final int   TYPE_STRING      = 3;
     public static final int   TYPE_BOOLEAN     = 4;
 
-    /**
-     * 
-     */
     private static final long serialVersionUID = 400L;
-    private String            evaluator;
     private int               type;
 
     public LiteralRestrictionDescr(final String evaluator,
                                    final String text) {
         this( evaluator,
+              false,
+              null,
               text,
               TYPE_STRING );// default type is string if not specified
     }
 
     public LiteralRestrictionDescr(final String evaluator,
+                                   final boolean isNegated,
+                                   final String text) {
+        this( evaluator,
+              isNegated,
+              null,
+              text,
+              TYPE_STRING );// default type is string if not specified
+    }
+
+    public LiteralRestrictionDescr(final String evaluator,
+                                   final boolean isNegated,
+                                   final String parameterText,
                                    final String text,
                                    final int type) {
+        super( evaluator,
+               isNegated,
+               parameterText );
         this.setText( text );
-        this.evaluator = evaluator;
         this.type = type;
     }
 
-    public String getEvaluator() {
-        return this.evaluator;
+    public String toString() {
+        return "[LiteralRestriction: " + super.toString() + " " + this.getText() + "]";
     }
 
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
     public Object getValue() {
-        switch( this.type ) {
-            case TYPE_NUMBER:
+        switch ( this.type ) {
+            case TYPE_NUMBER :
                 try {
                     return DecimalFormat.getInstance().parse( this.getText() );
                 } catch ( ParseException e ) {
                     // return String anyway
                     return this.getText();
                 }
-            case TYPE_BOOLEAN:
+            case TYPE_BOOLEAN :
                 return Boolean.valueOf( this.getText() );
-            default:
+            default :
                 return this.getText();
         }
     }
-
-    public String toString() {
-        return "[LiteralRestriction: " + this.evaluator + " " + this.getText() + "]";
-
-    }
-
-    public int getType() {
-        return type;
-    }
-
-    public void setType(int type) {
-        this.type = type;
-    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PredicateDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PredicateDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/PredicateDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -21,27 +21,12 @@
      * 
      */
     private static final long serialVersionUID = 400L;
-    //private final String fieldName;
     private Object            content;
 
-    //private final String declaration;
     private String[]          declarations;
 
     private String            classMethodName;
 
-    //    public PredicateDescr(final String fieldName,
-    //                          final String declaration) {
-    //        this.fieldName = fieldName;
-    //        this.declaration = declaration;
-    //    }
-    //
-    //    public PredicateDescr(final String fieldName,
-    //                          final String declaration,
-    //                          final String text) {
-    //        this.fieldName = fieldName;
-    //        this.declaration = declaration;
-    //        this.text = text;
-    //    }
     public PredicateDescr(final Object text) {
         this.content = text;
     }
@@ -49,10 +34,6 @@
     public PredicateDescr() {
     }
 
-    //    public String getFieldName() {
-    //        return this.fieldName;
-    //    }
-
     public String getClassMethodName() {
         return this.classMethodName;
     }
@@ -69,10 +50,6 @@
         this.content = text;
     }
 
-    //    public String getDeclaration() {
-    //        return this.declaration;
-    //    }
-
     public void setDeclarations(final String[] declarations) {
         this.declarations = declarations;
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/QualifiedIdentifierRestrictionDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -22,33 +22,21 @@
  * field of a pattern. 
  * The "text" contains the content. 
  */
-public class QualifiedIdentifierRestrictionDescr extends RestrictionDescr {
-    /**
-     * 
-     */
+public class QualifiedIdentifierRestrictionDescr extends EvaluatorBasedRestrictionDescr {
+
     private static final long serialVersionUID = 400L;
-    private String            evaluator;
-    private String            text;
 
     public QualifiedIdentifierRestrictionDescr(final String evaluator,
-                                   final String text) {
-        this.text = text;
-        this.evaluator = evaluator;
+                                               final boolean isNegated,
+                                               final String parameterText,
+                                               final String text) {
+        super( evaluator,
+               isNegated,
+               parameterText );
+        this.setText( text );
     }
-    
-    public void setText(String text) {
-        this.text = text;
-    }
-    
-    public String getEvaluator() {
-        return this.evaluator;
-    }
 
-    public String getText() {
-        return this.text;
-    }
-
     public String toString() {
-        return "[QualifiedIndentifierRestr: " + this.evaluator + " " + this.text + " ]";
+        return "[QualifiedIndentifierRestr: " + super.toString() + " " + this.getText() + " ]";
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RestrictionConnectiveDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RestrictionConnectiveDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/RestrictionConnectiveDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -13,57 +13,74 @@
  */
 public class RestrictionConnectiveDescr extends RestrictionDescr {
 
-    private static final long serialVersionUID = 400L;
-    public final static int   AND              = 0;
-    public final static int   OR               = 1;
+    private static final long                     serialVersionUID = 400L;
 
-    private int               connective;
-    private List              restrictions;
+    public final static RestrictionConnectiveType AND              = RestrictionConnectiveType.AND;
+    public final static RestrictionConnectiveType OR               = RestrictionConnectiveType.OR;
 
-    public RestrictionConnectiveDescr(final int connective) {
+    private RestrictionConnectiveType             connective;
+    private List<RestrictionDescr>                restrictions;
+
+    public RestrictionConnectiveDescr(final RestrictionConnectiveType connective) {
         super();
         this.connective = connective;
-        this.restrictions = Collections.EMPTY_LIST;
+        this.restrictions = Collections.emptyList();
     }
 
-    public int getConnective() {
+    public RestrictionConnectiveType getConnective() {
         return this.connective;
     }
-    
-    public void addRestriction( RestrictionDescr restriction ) {
-        if( this.restrictions == Collections.EMPTY_LIST ) {
-            this.restrictions = new ArrayList();
+
+    public void addRestriction(RestrictionDescr restriction) {
+        if ( this.restrictions == Collections.EMPTY_LIST ) {
+            this.restrictions = new ArrayList<RestrictionDescr>();
         }
         this.restrictions.add( restriction );
     }
-    
-    public void addOrMerge( RestrictionDescr restriction ) {
-        if(( restriction instanceof RestrictionConnectiveDescr ) &&
-           ((RestrictionConnectiveDescr)restriction).connective == this.connective ) {
-            if( this.restrictions == Collections.EMPTY_LIST ) {
-                this.restrictions = new ArrayList();
+
+    public void addOrMerge(RestrictionDescr restriction) {
+        if ( (restriction instanceof RestrictionConnectiveDescr) && ((RestrictionConnectiveDescr) restriction).connective == this.connective ) {
+            if ( this.restrictions == Collections.EMPTY_LIST ) {
+                this.restrictions = new ArrayList<RestrictionDescr>();
             }
-            this.restrictions.addAll( ((RestrictionConnectiveDescr)restriction).getRestrictions() );
+            this.restrictions.addAll( ((RestrictionConnectiveDescr) restriction).getRestrictions() );
         } else {
             this.addRestriction( restriction );
         }
     }
-    
-    public List getRestrictions() {
+
+    public List<RestrictionDescr> getRestrictions() {
         return this.restrictions;
     }
-    
+
     public String toString() {
-        final String connectiveStr = this.connective == OR ? " || " : " && ";
         final StringBuffer buf = new StringBuffer();
         buf.append( "( " );
-        for( Iterator it = this.restrictions.iterator(); it.hasNext(); ) {
+        for ( Iterator it = this.restrictions.iterator(); it.hasNext(); ) {
             buf.append( it.next().toString() );
-            if( it.hasNext() ) {
-                buf.append( connectiveStr );
+            if ( it.hasNext() ) {
+                buf.append( this.connective.toString() );
             }
         }
         buf.append( "  )" );
         return buf.toString();
     }
+
+    /**
+     * The connective types that can be used for a restriction
+     * 
+     * @author etirelli
+     */
+    public static enum RestrictionConnectiveType {
+        AND {
+            public String toString() {
+                return "&&";
+            }
+        },
+        OR {
+            public String toString() {
+                return "||";
+            }
+        };
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/ReturnValueRestrictionDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,24 +16,42 @@
  * limitations under the License.
  */
 
-public class ReturnValueRestrictionDescr extends RestrictionDescr {
-    /**
-     * 
-     */
+public class ReturnValueRestrictionDescr extends EvaluatorBasedRestrictionDescr {
+
     private static final long serialVersionUID = 400L;
-    private String            evaluator;
     private Object            content;
     private String[]          declarations;
-
     private String            classMethodName;
 
-    public ReturnValueRestrictionDescr(final String evaluator) {
-        this.evaluator = evaluator;
+    public ReturnValueRestrictionDescr(final String evaluator ) {
+        super( evaluator,
+               false,
+               null );
     }
 
+    public ReturnValueRestrictionDescr(final String evaluator, 
+                                       final Object content ) {
+        super( evaluator,
+               false,
+               null );
+        this.content = content;
+    }
+
+    public ReturnValueRestrictionDescr(final String evaluator, 
+                                       final boolean isNegated,
+                                       final String parameterText ) {
+        super( evaluator,
+               isNegated,
+               parameterText );
+    }
+
     public ReturnValueRestrictionDescr(final String evaluator,
+                                       final boolean isNegated,
+                                       final String parameterText, 
                                        final Object content) {
-        this.evaluator = evaluator;
+        super( evaluator,
+               isNegated,
+               parameterText );
         this.content = content;
     }
 
@@ -45,10 +63,6 @@
         this.classMethodName = classMethodName;
     }
 
-    public String getEvaluator() {
-        return this.evaluator;
-    }
-
     public Object getContent() {
         return this.content;
     }
@@ -66,6 +80,6 @@
     }
 
     public String toString() {
-        return "[ReturnValue: " + this.evaluator + " " + this.content + "]";
+        return "[ReturnValue: " + super.toString() + " " + this.content + "]";
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/VariableRestrictionDescr.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,29 +16,34 @@
  * limitations under the License.
  */
 
-public class VariableRestrictionDescr extends RestrictionDescr {
-    /**
-     * 
-     */
+public class VariableRestrictionDescr extends EvaluatorBasedRestrictionDescr {
+
     private static final long serialVersionUID = 400L;
-    private String            evaluator;
-    private String            declarationIdentifier;
 
     public VariableRestrictionDescr(final String evaluator,
-                                    final String identifier) {
-        this.declarationIdentifier = identifier;
-        this.evaluator = evaluator;
+                                    final String identifier ) {
+        super( evaluator,
+               false,
+               null );
+        this.setText( identifier );
     }
 
-    public String getEvaluator() {
-        return this.evaluator;
+    public VariableRestrictionDescr(final String evaluator,
+                                    final boolean isNegated,
+                                    final String parameterText,
+                                    final String identifier ) {
+        super( evaluator,
+               isNegated,
+               parameterText );
+        this.setText( identifier );
     }
 
     public String getIdentifier() {
-        return this.declarationIdentifier;
+        return this.getText();
     }
     
     public String toString() {
-        return "[VariableRestriction: " + evaluator + " " + declarationIdentifier + " ]";
+        return "[VariableRestriction: " + super.toString() + " " + this.getText() + " ]";
     }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,27 +17,16 @@
 package org.drools.rule.builder;
 
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Stack;
 
-import org.drools.base.evaluators.DateFactory;
 import org.drools.compiler.Dialect;
-import org.drools.compiler.DialectConfiguration;
 import org.drools.compiler.DialectRegistry;
 import org.drools.compiler.PackageBuilderConfiguration;
-import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.BaseDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.RuleDescr;
 import org.drools.rule.Dialectable;
 import org.drools.rule.Package;
-import org.drools.rule.Query;
-import org.drools.rule.Rule;
-import org.drools.spi.DeclarationScopeResolver;
 
 /**
  * A context for the current build

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -25,7 +25,7 @@
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorDefinition;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DescrBuildError;
 import org.drools.facttemplates.FactTemplate;
@@ -107,9 +107,9 @@
 
         if ( patternDescr.getObjectType() == null || patternDescr.getObjectType().equals( "" ) ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    patternDescr,
-                                                    null,
-                                                    "ObjectType not correctly defined" ) );
+                                                          patternDescr,
+                                                          null,
+                                                          "ObjectType not correctly defined" ) );
             return null;
         }
 
@@ -122,12 +122,14 @@
         } else {
             try {
                 final Class userProvidedClass = context.getDialect().getTypeResolver().resolveType( patternDescr.getObjectType() );
-                objectType = new ClassObjectType( userProvidedClass );
+                final boolean isEvent = context.getPkg().isEvent( userProvidedClass );
+                objectType = new ClassObjectType( userProvidedClass,
+                                                  isEvent );
             } catch ( final ClassNotFoundException e ) {
                 context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                        patternDescr,
-                                                        null,
-                                                        "Unable to resolve ObjectType '" + patternDescr.getObjectType() + "'" ) );
+                                                              patternDescr,
+                                                              null,
+                                                              "Unable to resolve ObjectType '" + patternDescr.getObjectType() + "'" ) );
                 return null;
             }
         }
@@ -138,16 +140,16 @@
             if ( context.getDeclarationResolver().isDuplicated( patternDescr.getIdentifier() ) ) {
                 // This declaration already  exists, so throw an Exception
                 context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                        patternDescr,
-                                                        null,
-                                                        "Duplicate declaration for variable '" + patternDescr.getIdentifier() + "' in the rule '" + context.getRule().getName() + "'" ) );
+                                                              patternDescr,
+                                                              null,
+                                                              "Duplicate declaration for variable '" + patternDescr.getIdentifier() + "' in the rule '" + context.getRule().getName() + "'" ) );
             }
 
             pattern = new Pattern( context.getNextPatternId(),
                                    0, // offset is 0 by default
                                    objectType,
                                    patternDescr.getIdentifier(),
-                                   patternDescr.isInternalFact());
+                                   patternDescr.isInternalFact() );
         } else {
             pattern = new Pattern( context.getNextPatternId(),
                                    0, // offset is 0 by default
@@ -228,9 +230,9 @@
             }
         } else {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    (BaseDescr) constraint,
-                                                    null,
-                                                    "This is a bug: unable to build constraint descriptor: '" + constraint + "' in rule '" + context.getRule().getName() + "'" ) );
+                                                          (BaseDescr) constraint,
+                                                          null,
+                                                          "This is a bug: unable to build constraint descriptor: '" + constraint + "' in rule '" + context.getRule().getName() + "'" ) );
         }
     }
 
@@ -274,7 +276,7 @@
                                                             fieldName,
                                                             false );
         if ( extractor == null ) {
-            if( fieldConstraintDescr.getFieldName().startsWith( "this." ) ) {
+            if ( fieldConstraintDescr.getFieldName().startsWith( "this." ) ) {
                 // it may still be MVEL special syntax, like map key syntax, so try eval
                 rewriteToEval( context,
                                pattern,
@@ -285,9 +287,9 @@
                 return;
             } else {
                 context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                        fieldConstraintDescr,
-                                                        null,
-                                                        "Unable to create Field Extractor for '" + fieldName + "' of '"+pattern.getObjectType().toString()+"' in rule '"+context.getRule().getName()+"'" ) );
+                                                              fieldConstraintDescr,
+                                                              null,
+                                                              "Unable to create Field Extractor for '" + fieldName + "' of '" + pattern.getObjectType().toString() + "' in rule '" + context.getRule().getName() + "'" ) );
                 return;
             }
         }
@@ -318,9 +320,9 @@
                                                     (ReturnValueRestriction) restriction );
         } else {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    fieldConstraintDescr,
-                                                    null,
-                                                    "This is a bug: Unkown restriction type '" + restriction.getClass() + "' for pattern '"+pattern.getObjectType().toString()+"' in rule '"+context.getRule().getName()+"'" ) );
+                                                          fieldConstraintDescr,
+                                                          null,
+                                                          "This is a bug: Unkown restriction type '" + restriction.getClass() + "' for pattern '" + pattern.getObjectType().toString() + "' in rule '" + context.getRule().getName() + "'" ) );
         }
 
         if ( container == null ) {
@@ -377,15 +379,15 @@
 
             } else {
                 restrictions[index] = buildRestriction( context,
-                                                          pattern,
-                                                          extractor,
-                                                          fieldConstraintDescr,
-                                                          restrictionDescr );
-                if( restrictions[index] == null ) {
+                                                        pattern,
+                                                        extractor,
+                                                        fieldConstraintDescr,
+                                                        restrictionDescr );
+                if ( restrictions[index] == null ) {
                     context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                            fieldConstraintDescr,
-                                                            null,
-                                                            "Unable to create restriction '" + restrictionDescr.toString() + "' for field '"+ fieldConstraintDescr.getFieldName() +"' in the rule '" + context.getRule().getName() + "'" ) );
+                                                                  fieldConstraintDescr,
+                                                                  null,
+                                                                  "Unable to create restriction '" + restrictionDescr.toString() + "' for field '" + fieldConstraintDescr.getFieldName() + "' in the rule '" + context.getRule().getName() + "'" ) );
                 }
                 index++;
             }
@@ -399,9 +401,10 @@
                 composite = new OrCompositeRestriction( restrictions );
             } else {
                 context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                        fieldConstraintDescr,
-                                                        null,
-                                                        "This is a bug: Impossible to create a composite restriction for connective: " + top.getConnective()+ "' for field '"+ fieldConstraintDescr.getFieldName() +"' in the rule '" + context.getRule().getName() + "'" ) );
+                                                              fieldConstraintDescr,
+                                                              null,
+                                                              "This is a bug: Impossible to create a composite restriction for connective: " + top.getConnective() + "' for field '" + fieldConstraintDescr.getFieldName() + "' in the rule '"
+                                                                      + context.getRule().getName() + "'" ) );
             }
 
             return composite;
@@ -409,9 +412,9 @@
             return restrictions[0];
         }
         context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                fieldConstraintDescr,
-                                                null,
-                                                "This is a bug: trying to create a restriction for an empty restriction list for field '"+ fieldConstraintDescr.getFieldName() +"' in the rule '" + context.getRule().getName() + "'" ) );
+                                                      fieldConstraintDescr,
+                                                      null,
+                                                      "This is a bug: trying to create a restriction for an empty restriction list for field '" + fieldConstraintDescr.getFieldName() + "' in the rule '" + context.getRule().getName() + "'" ) );
         return null;
     }
 
@@ -422,9 +425,9 @@
         if ( context.getDeclarationResolver().isDuplicated( fieldBindingDescr.getIdentifier() ) ) {
             // This declaration already  exists, so throw an Exception
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    fieldBindingDescr,
-                                                    null,
-                                                    "Duplicate declaration for variable '" + fieldBindingDescr.getIdentifier() + "' in the rule '" + context.getRule().getName() + "'" ) );
+                                                          fieldBindingDescr,
+                                                          null,
+                                                          "Duplicate declaration for variable '" + fieldBindingDescr.getIdentifier() + "' in the rule '" + context.getRule().getName() + "'" ) );
             return;
         }
 
@@ -597,9 +600,9 @@
                                                  final VariableRestrictionDescr variableRestrictionDescr) {
         if ( variableRestrictionDescr.getIdentifier() == null || variableRestrictionDescr.getIdentifier().equals( "" ) ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    variableRestrictionDescr,
-                                                    null,
-                                                    "Identifier not defined for binding field '" + fieldConstraintDescr.getFieldName() + "'" ) );
+                                                          variableRestrictionDescr,
+                                                          null,
+                                                          "Identifier not defined for binding field '" + fieldConstraintDescr.getFieldName() + "'" ) );
             return null;
         }
 
@@ -615,9 +618,9 @@
                 declaration = implicit;
             } else {
                 context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                        variableRestrictionDescr,
-                                                        null,
-                                                        "Unable to return Declaration for identifier '" + variableRestrictionDescr.getIdentifier() + "'" ) );
+                                                              variableRestrictionDescr,
+                                                              null,
+                                                              "Unable to return Declaration for identifier '" + variableRestrictionDescr.getIdentifier() + "'" ) );
                 return null;
             }
         }
@@ -625,7 +628,9 @@
         final Evaluator evaluator = getEvaluator( context,
                                                   variableRestrictionDescr,
                                                   extractor.getValueType(),
-                                                  variableRestrictionDescr.getEvaluator() );
+                                                  variableRestrictionDescr.getEvaluator(),
+                                                  variableRestrictionDescr.isNegated(),
+                                                  variableRestrictionDescr.getParameterText() );
         if ( evaluator == null ) {
             return null;
         }
@@ -645,9 +650,9 @@
                                                 extractor.getValueType() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    literalRestrictionDescr,
-                                                    e,
-                                                    "Unable to create a Field value of type  '" + extractor.getValueType() + "' and value '" + literalRestrictionDescr.getText() + "'" ) );
+                                                          literalRestrictionDescr,
+                                                          e,
+                                                          "Unable to create a Field value of type  '" + extractor.getValueType() + "' and value '" + literalRestrictionDescr.getText() + "'" ) );
         }
 
         if ( field == null ) {
@@ -657,7 +662,9 @@
         final Evaluator evaluator = getEvaluator( context,
                                                   literalRestrictionDescr,
                                                   extractor.getValueType(),
-                                                  literalRestrictionDescr.getEvaluator() );
+                                                  literalRestrictionDescr.getEvaluator(),
+                                                  literalRestrictionDescr.isNegated(),
+                                                  literalRestrictionDescr.getParameterText() );
         if ( evaluator == null ) {
             return null;
         }
@@ -692,19 +699,21 @@
 
                     } else {
                         context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                                qiRestrictionDescr,
-                                                                "",
-                                                                "Not possible to directly access the property '" + parts[1] + "' of declaration '" + parts[0] + "' since it is not a pattern" ) );
+                                                                      qiRestrictionDescr,
+                                                                      "",
+                                                                      "Not possible to directly access the property '" + parts[1] + "' of declaration '" + parts[0] + "' since it is not a pattern" ) );
                         return null;
                     }
                 }
             }
-            
-            if( implicit != null ) {
+
+            if ( implicit != null ) {
                 final Evaluator evaluator = getEvaluator( context,
                                                           qiRestrictionDescr,
                                                           extractor.getValueType(),
-                                                          qiRestrictionDescr.getEvaluator() );
+                                                          qiRestrictionDescr.getEvaluator(),
+                                                          qiRestrictionDescr.isNegated(),
+                                                          qiRestrictionDescr.getParameterText() );
                 if ( evaluator == null ) {
                     return null;
                 }
@@ -727,9 +736,9 @@
             // nothing to do, as it is not a class name with static field
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    qiRestrictionDescr,
-                                                    e,
-                                                    "Unable to create a Field value of type  '" + extractor.getValueType() + "' and value '" + qiRestrictionDescr.getText() + "'" ) );
+                                                          qiRestrictionDescr,
+                                                          e,
+                                                          "Unable to create a Field value of type  '" + extractor.getValueType() + "' and value '" + qiRestrictionDescr.getText() + "'" ) );
         }
 
         if ( field == null ) {
@@ -739,7 +748,9 @@
         final Evaluator evaluator = getEvaluator( context,
                                                   qiRestrictionDescr,
                                                   extractor.getValueType(),
-                                                  qiRestrictionDescr.getEvaluator() );
+                                                  qiRestrictionDescr.getEvaluator(),
+                                                  qiRestrictionDescr.isNegated(),
+                                                  qiRestrictionDescr.getParameterText() );
         if ( evaluator == null ) {
             return null;
         }
@@ -779,7 +790,9 @@
         final Evaluator evaluator = getEvaluator( context,
                                                   returnValueRestrictionDescr,
                                                   extractor.getValueType(),
-                                                  returnValueRestrictionDescr.getEvaluator() );
+                                                  returnValueRestrictionDescr.getEvaluator(),
+                                                  returnValueRestrictionDescr.isNegated(),
+                                                  returnValueRestrictionDescr.getParameterText() );
         if ( evaluator == null ) {
             return null;
         }
@@ -826,9 +839,9 @@
             } catch ( final RuntimeDroolsException e ) {
                 if ( reportError ) {
                     context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                            descr,
-                                                            e,
-                                                            "Unable to create Field Extractor for '" + fieldName + "'" ) );
+                                                                  descr,
+                                                                  e,
+                                                                  "Unable to create Field Extractor for '" + fieldName + "'" ) );
                 }
             }
         }
@@ -839,15 +852,28 @@
     private Evaluator getEvaluator(final RuleBuildContext context,
                                    final BaseDescr descr,
                                    final ValueType valueType,
-                                   final String evaluatorString) {
+                                   final String evaluatorString,
+                                   final boolean isNegated,
+                                   final String parameterText) {
 
-        final Evaluator evaluator = valueType.getEvaluator( Operator.determineOperator( evaluatorString ) );
+        final EvaluatorDefinition def = context.getConfiguration().getEvaluatorRegistry().getEvaluatorDefinition( evaluatorString );
+        if ( def == null ) {
+            context.getErrors().add( new DescrBuildError( context.getParentDescr(),
+                                                          descr,
+                                                          null,
+                                                          "Unable to determine the Evaluator for  ID '" + evaluatorString + "'" ) );
+        }
 
+        final Evaluator evaluator = def.getEvaluator( valueType,
+                                                      evaluatorString,
+                                                      isNegated,
+                                                      parameterText );
+
         if ( evaluator == null ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    descr,
-                                                    null,
-                                                    "Unable to determine the Evaluator for  '" + valueType + "' and '" + evaluatorString + "'" ) );
+                                                          descr,
+                                                          null,
+                                                          "Evaluator '" + (isNegated ? "not " : "") + evaluatorString + "' does not support type '" + valueType ) );
         }
 
         return evaluator;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -33,7 +33,8 @@
                                                              ValueType.STRING_TYPE );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
-                                                                    ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL ),
+                                                                    context.getConfiguration().getEvaluatorRegistry().getEvaluator( ValueType.STRING_TYPE,
+                                                                                                                                    Operator.EQUAL ),
                                                                     field );
         // adds appropriate constraint to the pattern
         pattern.addConstraint( constraint );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -24,9 +24,7 @@
 import java.util.Map;
 import java.util.Stack;
 
-import org.drools.base.evaluators.DateFactory;
 import org.drools.compiler.Dialect;
-import org.drools.compiler.DialectConfiguration;
 import org.drools.compiler.DialectRegistry;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.AttributeDescr;
@@ -36,6 +34,7 @@
 import org.drools.rule.Query;
 import org.drools.rule.Rule;
 import org.drools.spi.DeclarationScopeResolver;
+import org.drools.util.DateUtils;
 
 /**
  * A context for the current build
@@ -191,11 +190,11 @@
                 }
             } else if ( name.equals( "date-effective" ) ) {
                 final Calendar cal = Calendar.getInstance();
-                cal.setTime( DateFactory.parseDate( attributeDescr.getValue() ) );
+                cal.setTime( DateUtils.parseDate( attributeDescr.getValue() ) );
                 rule.setDateEffective( cal );
             } else if ( name.equals( "date-expires" ) ) {
                 final Calendar cal = Calendar.getInstance();
-                cal.setTime( DateFactory.parseDate( attributeDescr.getValue() ) );
+                cal.setTime( DateUtils.parseDate( attributeDescr.getValue() ) );
                 rule.setDateExpires( cal );
             } else if ( name.equals( "dialect" ) ) {
                 rule.setDialect( attributeDescr.getValue() );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaFunctionBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -48,7 +48,7 @@
                   pkg.getName() );
 
         vars.put( "imports",
-                  pkg.getImports() );
+                  pkg.getImports().keySet() );
 
         final List staticImports = new LinkedList();
         for( Iterator it = pkg.getStaticImports().iterator(); it.hasNext(); ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaProcessClassBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaProcessClassBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaProcessClassBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -20,6 +20,7 @@
 
 import org.drools.lang.descr.ProcessDescr;
 import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.ImportDeclaration;
 import org.drools.rule.builder.ProcessBuildContext;
 import org.drools.rule.builder.ProcessClassBuilder;
 import org.drools.rule.builder.RuleBuildContext;
@@ -48,8 +49,8 @@
         final StringBuffer buffer = new StringBuffer();
         buffer.append( "package " + context.getPkg().getName() + ";" + lineSeparator );
 
-        for ( final Iterator it = context.getPkg().getImports().iterator(); it.hasNext(); ) {
-            buffer.append( "import " + it.next() + ";" + lineSeparator );
+        for ( ImportDeclaration decl : context.getPkg().getImports().values() ) {
+            buffer.append( "import " +  ( decl.isEvent() ? "event " : "" ) + decl.getTarget() + ";" + lineSeparator );
         }
 
         for ( final Iterator it = context.getPkg().getStaticImports().iterator(); it.hasNext(); ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaRuleClassBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaRuleClassBuilder.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaRuleClassBuilder.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -45,7 +45,7 @@
         final StringBuffer buffer = new StringBuffer();
         buffer.append( "package " + context.getPkg().getName() + ";" + lineSeparator );
 
-        for ( final Iterator it = context.getPkg().getImports().iterator(); it.hasNext(); ) {
+        for ( final Iterator it = context.getPkg().getImports().keySet().iterator(); it.hasNext(); ) {
             buffer.append( "import " + it.next() + ";" + lineSeparator );
         }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/rules/QualifiedIdentifierRestrictionHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/rules/QualifiedIdentifierRestrictionHandler.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/rules/QualifiedIdentifierRestrictionHandler.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,8 +17,6 @@
  */
 
 import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.ListIterator;
 
 import org.drools.lang.descr.FieldConstraintDescr;
 import org.drools.lang.descr.LiteralRestrictionDescr;
@@ -32,7 +30,6 @@
 import org.drools.xml.Handler;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
 
 /**
  * @author fmeyer
@@ -67,10 +64,16 @@
         xmlPackageReader.startConfiguration( localName,
                                                   attrs );
 
-        final String evaluator = attrs.getValue( "evaluator" );
+        String evaluator = attrs.getValue( "evaluator" );
         emptyAttributeCheck( localName, "evaluator", evaluator, xmlPackageReader );
+        boolean isNegated = evaluator.startsWith( "not " );
+        if( isNegated ) {
+            evaluator = evaluator.substring( 4 );
+        }
 
         final QualifiedIdentifierRestrictionDescr qualifiedIdentifierRestricionDescr = new QualifiedIdentifierRestrictionDescr( evaluator,
+                                                                                                                                isNegated,
+                                                                                                                                null,
                                                                                                                                 null );
 
         return qualifiedIdentifierRestricionDescr;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/META-INF/drools.default.packagebuilder.conf	2007-12-10 18:37:22 UTC (rev 17161)
@@ -10,3 +10,10 @@
 drools.accumulate.function.min = org.drools.base.accumulators.MinAccumulateFunction
 drools.accumulate.function.count = org.drools.base.accumulators.CountAccumulateFunction
 drools.accumulate.function.sum = org.drools.base.accumulators.SumAccumulateFunction
+
+drools.evaluator.after = org.drools.base.evaluators.AfterEvaluatorDefinition
+drools.evaluator.equality = org.drools.base.evaluators.EqualityEvaluatorsDefinition
+drools.evaluator.comparable = org.drools.base.evaluators.ComparableEvaluatorsDefinition
+drools.evaluator.set = org.drools.base.evaluators.SetEvaluatorsDefinition
+drools.evaluator.matches = org.drools.base.evaluators.MatchesEvaluatorsDefinition
+drools.evaluator.soundslike = org.drools.base.evaluators.SoundslikeEvaluatorsDefinition

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/lang/DRL.g	2007-12-10 18:37:22 UTC (rev 17161)
@@ -223,6 +223,7 @@
 statement
 	:	a=rule_attribute { this.packageDescr.addAttribute( a ); }
 	|	function_import_statement 
+	|	event_import_statement
 	|	import_statement 
 	|	global 
 	|	function 
@@ -230,6 +231,7 @@
 	|	r=rule { this.packageDescr.addRule( $r.rule ); }			
 	|	q=query	{ this.packageDescr.addRule( $q.query ); }
 	;
+	
 package_statement returns [String packageName]
 	@init{
 		$packageName = null;
@@ -273,7 +275,22 @@
 	        import_name[importDecl] opt_semicolon
 	;
 
+event_import_statement
+        @init {
+        	ImportDescr importDecl = null;
+        }
+	:	IMPORT EVENT 
+	        {
+	            importDecl = factory.createEventImport( );
+	            importDecl.setStartCharacter( ((CommonToken)$IMPORT).getStartIndex() );
+		    if (packageDescr != null) {
+			packageDescr.addImport( importDecl );
+		    }
+	        }
+	        import_name[importDecl] opt_semicolon
+	;
 
+
 import_name[ImportDescr importDecl] returns [String name]
 	@init {
 		$name = null;
@@ -1337,15 +1354,13 @@
 		    }
 		}
 		(
-			( options {backtrack=true;}
-			: or_restr_connective[top]
+			or_restr_connective[top]
 			{
 				// we must add now as we didn't before
 				if( $ID != null) {
 				    $base.addDescr( fc );
 				}
 			}
-			)
 		|
 			'->' predicate[$base] 
 		)?
@@ -1368,10 +1383,8 @@
 			$base.addDescr( fc );
 		    }
 		}
-		( options {backtrack=true;}
-		: or_restr_connective[top]
+		or_restr_connective[top]
 		)
-		)
 	;
 	catch[ NoViableAltException nvae ] {
 	    if( input.LT(1) != null ) {
@@ -1394,7 +1407,7 @@
 		RestrictionConnectiveDescr or = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.OR);
 	}
 	:
-		and_restr_connective[or] 
+		and_restr_connective[or]
 		( 
 			options {backtrack=true;}
 			: DOUBLE_PIPE 
@@ -1417,7 +1430,7 @@
 		RestrictionConnectiveDescr and = new RestrictionConnectiveDescr(RestrictionConnectiveDescr.AND);
 	}
 	:
-		constraint_expression[and] 
+		constraint_expression[and]
 		(	options {backtrack=true;}
 		:	t=DOUBLE_AMPER 
 			{
@@ -1437,12 +1450,12 @@
 constraint_expression[RestrictionConnectiveDescr base]
         :	
 		( compound_operator[$base]
-		| simple_operator[$base]
+		| simple_operator[$base] 
 		| LEFT_PAREN 
 		{
 			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_OPERATOR);
 		}
-		or_restr_connective[$base] 
+		or_restr_connective[$base]
 		RIGHT_PAREN
  		)
 	;	
@@ -1450,6 +1463,8 @@
 simple_operator[RestrictionConnectiveDescr base]
 	@init {
 		String op = null;
+		String paramText = null;
+		boolean isNegated = false;
 	}
 	:
 		(	t='=='
@@ -1458,29 +1473,31 @@
 		|	t='<'
 		|	t='<='
 		|	t='!='
-		|	t=CONTAINS
-		|	n=NOT t=CONTAINS
-		|	t=EXCLUDES
-		|	t=MATCHES
-		|	t=SOUNDSLIKE
-		|	n=NOT t=MATCHES
-		|	t=MEMBEROF
-		|	n=NOT t=MEMBEROF
+                |       t=CONTAINS
+                |       n=NOT t=CONTAINS
+                |       t=EXCLUDES
+                |       t=MATCHES
+                |       t=SOUNDSLIKE
+                |       n=NOT t=MATCHES
+                |       t=MEMBEROF
+                |       n=NOT t=MEMBEROF
+		|	TILDE t=ID param=square_chunk?
+		|	n=NOT TILDE t=ID param=square_chunk?
 		)
 		{
   		    location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_ARGUMENT);
                     location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, $t.text);
-		    if( $n != null ) {
-		        op = "not "+$t.text;
-		    } else {
-		        op = $t.text;
-		    }
+ 	            op = $t.text;
+ 	            isNegated = $n != null;
+ 	            if( param != null ) {
+                        paramText = safeSubstring( $param.text, 1, $param.text.length()-1 );
+ 	            } 
 		}
-		rd=expression_value[$base, op]
+		rd=expression_value[$base, op, isNegated, paramText]
 	;	
 	finally {
 		if ( $rd.rd == null && op != null ) {
-		        $base.addRestriction( new LiteralRestrictionDescr(op, null) );
+		        $base.addRestriction( new LiteralRestrictionDescr(op, false, null) );
 		}
 	}
 	
@@ -1507,15 +1524,15 @@
                     	  location.setProperty(Location.LOCATION_PROPERTY_OPERATOR, "in");
 			}	
 		)
-		LEFT_PAREN rd=expression_value[group, op]
-		( COMMA rd=expression_value[group, op]	)* 
+		LEFT_PAREN rd=expression_value[group, op, false, null]
+		( COMMA rd=expression_value[group, op, false, null]	)* 
 		RIGHT_PAREN 
 		{
 			location.setType(Location.LOCATION_LHS_INSIDE_CONDITION_END);
 		}
 	;
 	
-expression_value[RestrictionConnectiveDescr base, String op] returns [RestrictionDescr rd]
+expression_value[RestrictionConnectiveDescr base, String op, boolean isNegated, String paramText] returns [RestrictionDescr rd]
 	@init {
 		$rd = null;
 	}
@@ -1523,18 +1540,18 @@
 		(	ap=accessor_path 
 			{ 
 			        if( $ap.text.indexOf( '.' ) > -1 || $ap.text.indexOf( '[' ) > -1) {
-					$rd = new QualifiedIdentifierRestrictionDescr($op, $ap.text);
+					$rd = new QualifiedIdentifierRestrictionDescr($op, $isNegated, $paramText, $ap.text);
 				} else {
-					$rd = new VariableRestrictionDescr($op, $ap.text);
+					$rd = new VariableRestrictionDescr($op, $isNegated, $paramText, $ap.text);
 				}
 			}						
 		|	lc=literal_constraint 
 			{ 
-				$rd  = new LiteralRestrictionDescr($op, $lc.text, $lc.type );
+				$rd  = new LiteralRestrictionDescr($op, $isNegated, $paramText, $lc.text, $lc.type );
 			}
 		|	rvc=paren_chunk 
 			{ 
-				$rd = new ReturnValueRestrictionDescr($op, safeSubstring( $rvc.text, 1, $rvc.text.length()-1) );							
+				$rd = new ReturnValueRestrictionDescr($op, $isNegated, $paramText, safeSubstring( $rvc.text, 1, $rvc.text.length()-1) );							
 			} 
 		)	
 		{
@@ -1664,6 +1681,7 @@
 	|	FUNCTION
 	|	GLOBAL
 	|	IMPORT  
+	|	EVENT
 	|	RULE
 	|	QUERY 
         |       TEMPLATE        
@@ -1677,12 +1695,11 @@
         |       ACTION	        
         |       REVERSE	        
         |       RESULT	        
-        |       CONTAINS 	
-        |       EXCLUDES 	
+        |       CONTAINS 
+        |       EXCLUDES 
         |       MEMBEROF
         |       MATCHES 
         |       SOUNDSLIKE        
-//        |       NULL	        
         |       WHEN            
         |       THEN	        
         |       END     
@@ -1753,6 +1770,8 @@
 
 FUNCTION :	'function';
 
+EVENT :		'event';
+
 GLOBAL	:	'global';
 	
 RULE    :	'rule';
@@ -1817,17 +1836,17 @@
 AND	:	'and';
 
 CONTAINS 
-	:	'contains';
-	
+       :       'contains';
+
 EXCLUDES 
-	:	'excludes';
-	
+       :       'excludes';
+
 MEMBEROF
-	:	'memberOf';
+       :       'memberOf';
 
-MATCHES :	'matches';
+MATCHES :      'matches';
 
-SOUNDSLIKE :	'soundslike';
+SOUNDSLIKE :   'soundslike';
 
 IN	:	'in';
 
@@ -1889,6 +1908,8 @@
 	:	'||'
 	;				
 	
+TILDE	:	'~';	
+	
 SH_STYLE_SINGLE_LINE_COMMENT	
 	:	'#' ( options{greedy=false;} : .)* EOL /* ('\r')? '\n'  */
                 { $channel=HIDDEN; setText("//"+getText().substring(1));}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderEvent.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/OrderEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/OrderEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Oct 17, 2007
+ */
+package org.drools;
+
+/**
+ * A simple order event POJO
+ * 
+ * @author etirelli
+ */
+public class OrderEvent {
+    
+    private String id;
+    private String customer;
+    private double total;
+    
+    public OrderEvent(String id,
+                      String customer,
+                      double total) {
+        super();
+        this.id = id;
+        this.customer = customer;
+        this.total = total;
+    }
+
+    public String getCustomer() {
+        return customer;
+    }
+
+    public void setCustomer(String customer) {
+        this.customer = customer;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public double getTotal() {
+        return total;
+    }
+
+    public void setTotal(double total) {
+        this.total = total;
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/StockTick.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,52 @@
+package org.drools;
+
+public class StockTick {
+    private long seq;
+    private String company;
+    private double price;
+    private long time;
+    
+    public StockTick() {
+    }
+
+    public StockTick(long seq,
+                     String company,
+                     double price,
+                     long time) {
+        super();
+        this.seq = seq;
+        this.company = company;
+        this.price = price;
+        this.time = time;
+    }
+
+    public String getCompany() {
+        return company;
+    }
+    public void setCompany(String company) {
+        this.company = company;
+    }
+    public double getPrice() {
+        return price;
+    }
+    public void setPrice(double price) {
+        this.price = price;
+    }
+    public long getSeq() {
+        return seq;
+    }
+    public void setSeq(long seq) {
+        this.seq = seq;
+    }
+    public long getTime() {
+        return time;
+    }
+    public void setTime(long time) {
+        this.time = time;
+    }
+    
+    public String toString() {
+        return "StockTick( "+this.seq+" : " +this.company +" : "+ this.price +" )";
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,268 @@
+package org.drools.integrationtests;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.drools.ClockType;
+import org.drools.OrderEvent;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.TemporalSession;
+import org.drools.StockTick;
+import org.drools.WorkingMemory;
+import org.drools.common.EventFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilder;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.rule.Package;
+import org.drools.temporal.SessionPseudoClock;
+
+public class CepEspTest extends TestCase {
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+
+    private RuleBase loadRuleBase(final Reader reader) throws IOException,
+                                                      DroolsParserException,
+                                                      Exception {
+        final DrlParser parser = new DrlParser();
+        final PackageDescr packageDescr = parser.parse( reader );
+        if ( parser.hasErrors() ) {
+            System.out.println( parser.getErrors() );
+            Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
+        }
+        // pre build the package
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackage( packageDescr );
+        final Package pkg = builder.getPackage();
+
+        // add the package to a rulebase
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        // load up the rulebase
+        return ruleBase;
+    }
+
+    public void testEventAssertion() throws Exception {
+        // read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleEventAssertion.drl" ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+
+        final WorkingMemory wm = ruleBase.newTemporalSession( ClockType.PSEUDO_CLOCK );
+        final List results = new ArrayList();
+
+        wm.setGlobal( "results",
+                      results );
+
+        StockTick tick1 = new StockTick( 1,
+                                         "DROO",
+                                         50,
+                                         System.currentTimeMillis() );
+        StockTick tick2 = new StockTick( 2,
+                                         "ACME",
+                                         10,
+                                         System.currentTimeMillis() );
+        StockTick tick3 = new StockTick( 3,
+                                         "ACME",
+                                         10,
+                                         System.currentTimeMillis() );
+        StockTick tick4 = new StockTick( 4,
+                                         "DROO",
+                                         50,
+                                         System.currentTimeMillis() );
+
+        InternalFactHandle handle1 = (InternalFactHandle) wm.insert( tick1 );
+        InternalFactHandle handle2 = (InternalFactHandle) wm.insert( tick2 );
+        InternalFactHandle handle3 = (InternalFactHandle) wm.insert( tick3 );
+        InternalFactHandle handle4 = (InternalFactHandle) wm.insert( tick4 );
+
+        assertNotNull( handle1 );
+        assertNotNull( handle2 );
+        assertNotNull( handle3 );
+        assertNotNull( handle4 );
+
+        assertTrue( handle1.isEvent() );
+        assertTrue( handle2.isEvent() );
+        assertTrue( handle3.isEvent() );
+        assertTrue( handle4.isEvent() );
+
+        wm.fireAllRules();
+
+        assertEquals( 2,
+                      results.size() );
+
+    }
+
+    public void testTimeRelationalOperators() throws Exception {
+        // read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_TimeRelationalOperators.drl" ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+
+        final TemporalSession<SessionPseudoClock> wm = ruleBase.newTemporalSession( ClockType.PSEUDO_CLOCK );
+        final SessionPseudoClock clock = wm.getSessionClock();
+
+        clock.setStartupTime( 1000 );
+        final List results = new ArrayList();
+
+        wm.setGlobal( "results",
+                      results );
+
+        StockTick tick1 = new StockTick( 1,
+                                         "DROO",
+                                         50,
+                                         System.currentTimeMillis() );
+        StockTick tick2 = new StockTick( 2,
+                                         "ACME",
+                                         10,
+                                         System.currentTimeMillis() );
+        StockTick tick3 = new StockTick( 3,
+                                         "ACME",
+                                         10,
+                                         System.currentTimeMillis() );
+        StockTick tick4 = new StockTick( 4,
+                                         "DROO",
+                                         50,
+                                         System.currentTimeMillis() );
+
+        InternalFactHandle handle1 = (InternalFactHandle) wm.insert( tick1 );
+        clock.advanceTime( 4 );
+        InternalFactHandle handle2 = (InternalFactHandle) wm.insert( tick2 );
+        clock.advanceTime( 4 );
+        InternalFactHandle handle3 = (InternalFactHandle) wm.insert( tick3 );
+        clock.advanceTime( 4 );
+        InternalFactHandle handle4 = (InternalFactHandle) wm.insert( tick4 );
+
+        assertNotNull( handle1 );
+        assertNotNull( handle2 );
+        assertNotNull( handle3 );
+        assertNotNull( handle4 );
+
+        assertTrue( handle1.isEvent() );
+        assertTrue( handle2.isEvent() );
+        assertTrue( handle3.isEvent() );
+        assertTrue( handle4.isEvent() );
+
+        wm.fireAllRules();
+
+        assertEquals( 1,
+                      results.size() );
+        assertEquals( tick3,
+                      results.get( 0 ) );
+
+    }
+
+    public void testSimpleTimeWindow() throws Exception {
+        // read in the source
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleTimeWindow.drl" ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+
+        final TemporalSession<SessionPseudoClock> wm = ruleBase.newTemporalSession( ClockType.PSEUDO_CLOCK );
+        final List results = new ArrayList();
+
+        wm.setGlobal( "results",
+                      results );
+
+        // how to initialize the clock?
+        // how to configure the clock?
+        SessionPseudoClock clock = wm.getSessionClock();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle1 = (EventFactHandle) wm.insert( new OrderEvent( "1",
+                                                                               "customer A",
+                                                                               70 ) );
+        assertEquals( 10000,
+                      handle1.getStartTimestamp() );
+        assertEquals( 0,
+                      handle1.getDuration() );
+
+        wm.fireAllRules();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle2 = (EventFactHandle) wm.insert( new OrderEvent( "2",
+                                                                               "customer A",
+                                                                               60 ) );
+        assertEquals( 20000,
+                      handle2.getStartTimestamp() );
+        assertEquals( 0,
+                      handle2.getDuration() );
+
+        wm.fireAllRules();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle3 = (EventFactHandle) wm.insert( new OrderEvent( "3",
+                                                                               "customer A",
+                                                                               50 ) );
+        assertEquals( 30000,
+                      handle3.getStartTimestamp() );
+        assertEquals( 0,
+                      handle3.getDuration() );
+
+        wm.fireAllRules();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle4 = (EventFactHandle) wm.insert( new OrderEvent( "4",
+                                                                               "customer A",
+                                                                               30 ) );
+        assertEquals( 40000,
+                      handle4.getStartTimestamp() );
+        assertEquals( 0,
+                      handle4.getDuration() );
+
+        wm.fireAllRules();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle5 = (EventFactHandle) wm.insert( new OrderEvent( "5",
+                                                                               "customer A",
+                                                                               70 ) );
+        assertEquals( 50000,
+                      handle5.getStartTimestamp() );
+        assertEquals( 0,
+                      handle5.getDuration() );
+
+        wm.fireAllRules();
+
+        clock.advanceTime( 10000 ); // 10 seconds
+        EventFactHandle handle6 = (EventFactHandle) wm.insert( new OrderEvent( "6",
+                                                                               "customer A",
+                                                                               80 ) );
+        assertEquals( 60000,
+                      handle6.getStartTimestamp() );
+        assertEquals( 0,
+                      handle6.getDuration() );
+
+        wm.fireAllRules();
+
+    }
+
+    //    public void testTransactionCorrelation() throws Exception {
+    //        // read in the source
+    //        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_TransactionCorrelation.drl" ) );
+    //        final RuleBase ruleBase = loadRuleBase( reader );
+    //
+    //        final WorkingMemory wm = ruleBase.newStatefulSession();
+    //        final List results = new ArrayList();
+    //
+    //        wm.setGlobal( "results",
+    //                      results );
+    //
+    //
+    //    }
+
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -19,13 +19,13 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.evaluators.DateFactory;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
 import org.drools.compiler.PackageBuilder;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.rule.Package;
+import org.drools.util.DateUtils;
 import org.mvel.MVEL;
 
 public class MVELTest extends TestCase {
@@ -67,7 +67,7 @@
 
         assertEquals( "hello world", list2.get(0));
 
-        Date dt = DateFactory.parseDate( "10-Jul-1974" );
+        Date dt = DateUtils.parseDate( "10-Jul-1974" );
         assertEquals(dt, c.getUsedBy());
 
 

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator)

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,32 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator;
-
-import org.drools.WorkingMemory;
-
-
-/**
- * @author Matthias Groch
- *
- */
-public abstract class AbstractEventListener {
-
-	WorkingMemory wm;
-	
-	/**
-	 * @param wm
-	 */
-	public AbstractEventListener(WorkingMemory wm) {
-		this.wm = wm;
-	}
-
-	public void addEventToWM (Event ev){
-		wm.insert(ev);
-		wm.fireAllRules();	
-	}
-	
-	// send generated event and execute corresponding actions
-	public abstract void generatedEventSent(Event e);
-	
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import org.drools.WorkingMemory;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public abstract class AbstractEventListener {
+
+	WorkingMemory wm;
+	
+	/**
+	 * @param wm
+	 */
+	public AbstractEventListener(WorkingMemory wm) {
+		this.wm = wm;
+	}
+
+	public void addEventToWM (Event ev){
+		wm.insert(ev);
+		wm.fireAllRules();	
+	}
+	
+	// send generated event and execute corresponding actions
+	public abstract void generatedEventSent(Event e);
+	
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,163 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Matthias Groch
- *
- */
-public class Event implements Cloneable{
-	
-	public enum EventType {CUSTOM, PRODUCTION, STATUSCHANGED, HEARTBEAT, FAILURE};
-	
-	private EventType eventId;
-	private String parentId;
-	private Map<String,String> parameters;
-	private long startTime, endTime;
-	
-	public Event() {
-		this.parameters = new HashMap <String, String>();
-	}
-
-	/**
-	 * @param eventId The name of the event.
-	 * @param parentId The id of the corresponding site, resource, ...
-	 */
-	public Event(EventType eventId, String parentId) {
-		this();
-		this.eventId = eventId;
-		this.parentId = parentId;
-	}
-	
-	/**
-	 * @param eventId The name of the event.
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 */
-	public Event(EventType eventId, String parentId, long start, long end) {
-		this(eventId, parentId);
-		this.startTime = start;
-		this.endTime = end;
-	}
-	
-	/**
-	 * @return the event id
-	 */
-	public EventType getEventId() {
-		return this.eventId;
-	}
-
-	/**
-	 * @param eventId the event name to set
-	 */
-	public void setEventType(EventType eventId) {
-		this.eventId = eventId;
-	}
-	
-	/**
-	 * @return the endTime
-	 */
-	public long getEndTime() {
-		return endTime;
-	}
-
-	/**
-	 * @param endTime the endTime to set
-	 *//*
-	public void setEndTime(Calendar endTime) {
-		this.endTime = (Calendar)endTime.clone();
-	}*/
-
-	/**
-	 * @return the startTime
-	 */
-	public long getStartTime() {
-		return startTime;
-	}
-
-	/**
-	 * @param startTime the startTime to set
-	 *//*
-	public void setStartTime(Calendar startTime) {
-		this.startTime = (Calendar)startTime.clone();
-	}*/
-	
-	/**
-	 * @param startTime the startTime to set
-	 * @param endTime the endTime to set
-	 */
-	public void setTimes(long startTime, long endTime) {
-		this.startTime = startTime;
-		this.endTime = endTime;
-	}
-	
-	/**
-	 * @param startTime the startTime to set
-	 * @param endTime the endTime to set
-	 */
-	// used for primitive events where start end end time are equal
-	public void setTimes(long startAndEndTime) {
-		this.startTime = startAndEndTime;
-		this.endTime = startAndEndTime;
-	}
-
-	/**
-	 * @return the parentId
-	 */
-	public String getParentId() {
-		return parentId;
-	}
-
-	/**
-	 * @param ressourceId the ressourceId to set
-	 */
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-
-	/**
-	 * @return the parameters
-	 */
-	public Map<String, String> getParameters() {
-		return parameters;
-	}
-	
-	/**
-	 * @param parameter name of the parameter
-	 * @return value of the specified parameter
-	 */
-	public String getParamValue(String parameter) {
-		return parameters.get(parameter);
-	}
-	
-	/**
-	 * @param parameters the parameters to set
-	 */
-	public void addParameters(Map<String, String> parameters) {
-		this.parameters.putAll(parameters);
-	}
-	
-	/**
-	 * @param paramName the name of the added parameter to set
-	 * @param paramValue the value of the added parameter to set
-	 */
-	public void addParameter(String paramName, String paramValue) {
-		this.parameters.put(paramName, paramValue);
-	}
-	
-	public Object clone(){
-	    try
-	    {
-	      return super.clone();
-	    }
-	    catch ( CloneNotSupportedException e ) {
-	      // this shouldn’t happen, since we are Cloneable
-	      throw new InternalError();
-	    }
-	  }
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,163 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class Event implements Cloneable{
+	
+	public enum EventType {CUSTOM, PRODUCTION, STATUSCHANGED, HEARTBEAT, FAILURE};
+	
+	private EventType eventId;
+	private String parentId;
+	private Map<String,String> parameters;
+	private long startTime, endTime;
+	
+	public Event() {
+		this.parameters = new HashMap <String, String>();
+	}
+
+	/**
+	 * @param eventId The name of the event.
+	 * @param parentId The id of the corresponding site, resource, ...
+	 */
+	public Event(EventType eventId, String parentId) {
+		this();
+		this.eventId = eventId;
+		this.parentId = parentId;
+	}
+	
+	/**
+	 * @param eventId The name of the event.
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 */
+	public Event(EventType eventId, String parentId, long start, long end) {
+		this(eventId, parentId);
+		this.startTime = start;
+		this.endTime = end;
+	}
+	
+	/**
+	 * @return the event id
+	 */
+	public EventType getEventId() {
+		return this.eventId;
+	}
+
+	/**
+	 * @param eventId the event name to set
+	 */
+	public void setEventType(EventType eventId) {
+		this.eventId = eventId;
+	}
+	
+	/**
+	 * @return the endTime
+	 */
+	public long getEndTime() {
+		return endTime;
+	}
+
+	/**
+	 * @param endTime the endTime to set
+	 *//*
+	public void setEndTime(Calendar endTime) {
+		this.endTime = (Calendar)endTime.clone();
+	}*/
+
+	/**
+	 * @return the startTime
+	 */
+	public long getStartTime() {
+		return startTime;
+	}
+
+	/**
+	 * @param startTime the startTime to set
+	 *//*
+	public void setStartTime(Calendar startTime) {
+		this.startTime = (Calendar)startTime.clone();
+	}*/
+	
+	/**
+	 * @param startTime the startTime to set
+	 * @param endTime the endTime to set
+	 */
+	public void setTimes(long startTime, long endTime) {
+		this.startTime = startTime;
+		this.endTime = endTime;
+	}
+	
+	/**
+	 * @param startTime the startTime to set
+	 * @param endTime the endTime to set
+	 */
+	// used for primitive events where start end end time are equal
+	public void setTimes(long startAndEndTime) {
+		this.startTime = startAndEndTime;
+		this.endTime = startAndEndTime;
+	}
+
+	/**
+	 * @return the parentId
+	 */
+	public String getParentId() {
+		return parentId;
+	}
+
+	/**
+	 * @param ressourceId the ressourceId to set
+	 */
+	public void setParentId(String parentId) {
+		this.parentId = parentId;
+	}
+
+	/**
+	 * @return the parameters
+	 */
+	public Map<String, String> getParameters() {
+		return parameters;
+	}
+	
+	/**
+	 * @param parameter name of the parameter
+	 * @return value of the specified parameter
+	 */
+	public String getParamValue(String parameter) {
+		return parameters.get(parameter);
+	}
+	
+	/**
+	 * @param parameters the parameters to set
+	 */
+	public void addParameters(Map<String, String> parameters) {
+		this.parameters.putAll(parameters);
+	}
+	
+	/**
+	 * @param paramName the name of the added parameter to set
+	 * @param paramValue the value of the added parameter to set
+	 */
+	public void addParameter(String paramName, String paramValue) {
+		this.parameters.put(paramName, paramValue);
+	}
+	
+	public Object clone(){
+	    try
+	    {
+	      return super.clone();
+	    }
+	    catch ( CloneNotSupportedException e ) {
+	      // this shouldn’t happen, since we are Cloneable
+	      throw new InternalError();
+	    }
+	  }
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,65 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator;
-
-
-public class PseudoSessionClock
-	    {
- 	    
- 	    private long timer;
- 	
- 	    public PseudoSessionClock() {
- 	        this.timer = 0;
- 	    }
- 	    
- 	    /* (non-Javadoc)
- 	     * @see org.drools.temporal.SessionClock#getCurrentTime()
- 	     */
- 	    public long getCurrentTime() {
- 	        return this.timer;
- 	    }
- 	    
- 	    public long advanceTime( long millisecs ) {
- 	        this.timer += millisecs;
- 	        return this.timer;
- 	    }
- 	    
- 	   public long setTime( long timer ) {
-	        this.timer = timer;
-	        return this.timer;
-	    }
- 	   
- 	    // using current system time as reference
- 	    public long calcFuturePointInTime (long timeToAdd){
-	    	return this.timer+timeToAdd;
-		}
- 	    
- 	    // ------------------------------------------------------------------------------------
- 	    // static convenience methods
- 	    
- 	    // using an arbitrary starting point as reference
- 	    public static long calcFuturePointInTime (long currentTime, long timeToAdd){
- 	    	return currentTime+timeToAdd;
- 		}
- 	    
- 	    // convert seconds to milliseconds
- 		public static long timeInSeconds (long timeInSecs){
- 			return timeInSecs*1000;
- 		}
- 		
- 		// convert seconds to milliseconds
- 		public static long timeInMinutes (long timeInMins){
- 			return timeInSeconds(timeInMins)*60;
- 		}
- 		
- 		// convert seconds to milliseconds
- 		public static long timeInHours (long timeInHrs){
- 			return timeInMinutes(timeInHrs)*60;
- 		}
- 		
- 		// convert time given as hours, minutes, seconds, milliseconds to milliseconds
- 		public static long timeinHMSM (long hours, long mins, long secs, long msecs){
- 			return timeInHours(hours) + timeInMinutes(mins) + timeInSeconds(secs) + msecs;
- 		}
- 	}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,65 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator;
+
+
+public class PseudoSessionClock
+	    {
+ 	    
+ 	    private long timer;
+ 	
+ 	    public PseudoSessionClock() {
+ 	        this.timer = 0;
+ 	    }
+ 	    
+ 	    /* (non-Javadoc)
+ 	     * @see org.drools.temporal.SessionClock#getCurrentTime()
+ 	     */
+ 	    public long getCurrentTime() {
+ 	        return this.timer;
+ 	    }
+ 	    
+ 	    public long advanceTime( long millisecs ) {
+ 	        this.timer += millisecs;
+ 	        return this.timer;
+ 	    }
+ 	    
+ 	   public long setTime( long timer ) {
+	        this.timer = timer;
+	        return this.timer;
+	    }
+ 	   
+ 	    // using current system time as reference
+ 	    public long calcFuturePointInTime (long timeToAdd){
+	    	return this.timer+timeToAdd;
+		}
+ 	    
+ 	    // ------------------------------------------------------------------------------------
+ 	    // static convenience methods
+ 	    
+ 	    // using an arbitrary starting point as reference
+ 	    public static long calcFuturePointInTime (long currentTime, long timeToAdd){
+ 	    	return currentTime+timeToAdd;
+ 		}
+ 	    
+ 	    // convert seconds to milliseconds
+ 		public static long timeInSeconds (long timeInSecs){
+ 			return timeInSecs*1000;
+ 		}
+ 		
+ 		// convert seconds to milliseconds
+ 		public static long timeInMinutes (long timeInMins){
+ 			return timeInSeconds(timeInMins)*60;
+ 		}
+ 		
+ 		// convert seconds to milliseconds
+ 		public static long timeInHours (long timeInHrs){
+ 			return timeInMinutes(timeInHrs)*60;
+ 		}
+ 		
+ 		// convert time given as hours, minutes, seconds, milliseconds to milliseconds
+ 		public static long timeinHMSM (long hours, long mins, long secs, long msecs){
+ 			return timeInHours(hours) + timeInMinutes(mins) + timeInSeconds(secs) + msecs;
+ 		}
+ 	}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,238 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator;
-
-/**
- * @author Matthias Groch
- *
- */
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Random;
-
-import org.drools.FactHandle;
-import org.drools.WorkingMemory;
-
-
-
-public class SimpleEventGenerator {
-	
-	private WorkingMemory wm;
-	private long generationEndTime;
-	private static AbstractEventListener sendListener;
-	private boolean endInfinite;
-	private int eventSourceIdCounter;
-	private Map<String, Integer> eventSourceIds;
-	private LinkedList<EventOccurrence> nextEventSource;
-	private PseudoSessionClock myClock;
-	FactHandle clockHandle;
-	
-	/**
-	 * @param wm
-	 */
-	public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l) {
-		this (wm, l, 0);
-	}
-	
-	/**
-	 * @param wm
-	 * @param generationDuration
-	 * 
-	 */
-	public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l, long generationDuration) {
-		this.wm = wm;
-		this.sendListener = l;
-		// add session clock to working memory
-		this.myClock = new PseudoSessionClock();
-		this.clockHandle = wm.insert(myClock);
-		
-		this.generationEndTime = this.myClock.calcFuturePointInTime(generationDuration);
-		this.endInfinite = (generationDuration == 0);
-		this.eventSourceIdCounter = 0;
-		this.eventSourceIds = new HashMap<String, Integer>();
-		this.nextEventSource = new LinkedList<EventOccurrence>();
-	}
-	
-	/**
-	 * @return the endInfinite
-	 */
-	public boolean isEndInfinite() {
-		return endInfinite;
-	}
-	
-	// add source which will generate events from current clock time on, possibly forever (i.e. no boundaries)
-	public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur){
-		return addEventSource (id, ev, minOccur, avgOccur, 0, 0);
-	}
-	
-	// add source which will generate events from current clock time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
-	public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur, long maxDuration, int maxItems){
-		if (!eventSourceIds.containsKey(id)){
-			this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
-			EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, this.myClock.getCurrentTime(), maxDuration, maxItems);
-			this.nextEventSource.add (evOcc);
-			return evOcc;
-		}
-		return null;
-	}
-	
-	// add source which will generate events from the given start time on, possibly forever (i.e. no boundaries)
-	public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime){
-		return addDelayedEventSource (id, ev, minOccur, avgOccur, startTime, 0, 0);
-	}
-	
-	// add source which will generate events from the given start time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
-	public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime, long maxDuration, int maxItems){
-		if (!eventSourceIds.containsKey(id)){
-			this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
-			EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, startTime, maxDuration, maxItems);
-			this.nextEventSource.add (evOcc);
-			return evOcc;
-		}
-		return null;
-	}
-	
-	public void removeEventSource(String id){
-		Integer hashValue = eventSourceIds.get(id);
-		if (hashValue != null){
-			this.nextEventSource.remove(hashValue.intValue());
-			this.eventSourceIds.remove(id);
-			this.eventSourceIdCounter--;
-		}
-	}
-	
-	public static void sendGeneratedEvent(Event ev){
-		sendListener.generatedEventSent(ev);
-	}
-	
-
-	public void generate() {
-		EventOccurrence currentEGT;
-		Event currentEvent;
-		
-		//sort all events according to their first occurrence
-		Collections.sort(nextEventSource, new EventGenerationTimeComparator());
-		
-		// simulate ongoing simulation time and upcoming events
-		while (!nextEventSource.isEmpty()) {
-			
-			// get next event generation time from queue
-			currentEGT = nextEventSource.removeFirst();
-			currentEvent = (Event)currentEGT.getEvent().clone();
-			
-			// advance clock to time of currentEGT 
-			myClock.setTime(currentEGT.getNextOccurrenceTime());
-			
-			// send event corresponding to currentEGT
-			sendGeneratedEvent(currentEvent);
-			//System.out.println ("Sender "+currentEGT.getEventSenderId() + ": Sent "+currentEvent.getEventId()+" event for parent id " + currentEvent.getParentId() + " at " + Tools.formattedDate(currentEGT.getNextOccurrenceTime()));
-			
-			//update clock in working memory in order being able to process time sensitive rules
-			wm.update(clockHandle, myClock);
-			
-			// determine new event generation time for this event type
-			boolean occIsValid = currentEGT.calculateNextEventOccurrence();
-			// add the new generation time to the right position in the queue, 
-			// but only if the generated event met its local restrictions plus
-			// it is going to occur within the global time boundaries (or there are no such boundaries, respectively)
-			if (occIsValid && (isEndInfinite() || currentEGT.getNextOccurrenceTime() < this.generationEndTime)) {
-				int index = Collections.binarySearch(nextEventSource, currentEGT, new EventGenerationTimeComparator());
-				if (index < 0)
-					nextEventSource.add(-index-1, currentEGT);
-			}
-			//session.out.print ("\nQueue nach Bearbeitung: ");
-			//for (int i = 0; i < nextEventSource.size(); i++)
-			//	session.out.print (Tools.formattedDate(nextEventSource.get(i).getGenerationTime())+"\""+nextEventSource.get(i).getEventSenderId()+"; ");
-
-		};
-		
-		//System.out.println ("\nSending of messages finished");
-	}
-	
-}
-
-class EventOccurrence{
-	
-	private static Random myRandom = new Random();;
-	
-	private String eventSenderId;
-	private Event event;
-	private long evDeviation, evMinDur;
-	private int itemCounter, maxItems;
-	private long latestEnd;
-	private boolean infinite;
-	
-	public EventOccurrence(String eventSenderId, Event ev, long evMinDur, long avgOccur, long earliestStart, long maxDuration, int maxItems) {
-		this.eventSenderId = eventSenderId;
-		this.evMinDur = evMinDur;
-		this.evDeviation = 2*(avgOccur-evMinDur); 
-		
-		this.event = ev;
-		this.event.setTimes(earliestStart);
-		this.latestEnd = earliestStart+maxDuration;
-		this.maxItems = maxItems;
-		this.itemCounter = 0;
-		this.infinite = maxDuration<=0;
-		calculateNextEventOccurrence();
-	}
-
-	// returns true if event source has no boundaries or all restrictions (i.e. a generation duration or max. number of event instances) are met, false otherwise
-	public boolean calculateNextEventOccurrence (){
-		this.event.setTimes(this.event.getEndTime()+myRandom.nextInt((int)this.evDeviation)+this.evMinDur);
-		if (maxItems <=0){
-			if (isInfinite())
-				return true;
-			else return event.getEndTime()<this.latestEnd;
-			}
-			else {
-				this.itemCounter++;
-				if (this.itemCounter>this.maxItems)
-					return false;
-				if (isInfinite())
-					return true;
-				else return (event.getEndTime()<this.latestEnd);
-			}
-	}
-	
-	/**
-	 * @return the infinite
-	 */
-	private boolean isInfinite() {
-		return infinite;
-	}
-	
-	/**
-	 * @return the eventSenderId
-	 */
-	public String getEventSenderId() {
-		return eventSenderId;
-	}
-
-	/**
-	 * @return the time
-	 */
-	public long getNextOccurrenceTime() {
-		return this.event.getEndTime();
-	}
-
-	/**
-	 * @return the event
-	 */
-	public Event getEvent() {
-		return event;
-	}
-	
-}
-
-class EventGenerationTimeComparator implements Comparator<EventOccurrence>{
-
-	public int compare(EventOccurrence o1, EventOccurrence o2) {
-		return (int)(o1.getNextOccurrenceTime()-o2.getNextOccurrenceTime());
-	}
-	
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,238 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Random;
+
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+
+
+
+public class SimpleEventGenerator {
+	
+	private WorkingMemory wm;
+	private long generationEndTime;
+	private static AbstractEventListener sendListener;
+	private boolean endInfinite;
+	private int eventSourceIdCounter;
+	private Map<String, Integer> eventSourceIds;
+	private LinkedList<EventOccurrence> nextEventSource;
+	private PseudoSessionClock myClock;
+	FactHandle clockHandle;
+	
+	/**
+	 * @param wm
+	 */
+	public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l) {
+		this (wm, l, 0);
+	}
+	
+	/**
+	 * @param wm
+	 * @param generationDuration
+	 * 
+	 */
+	public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l, long generationDuration) {
+		this.wm = wm;
+		this.sendListener = l;
+		// add session clock to working memory
+		this.myClock = new PseudoSessionClock();
+		this.clockHandle = wm.insert(myClock);
+		
+		this.generationEndTime = this.myClock.calcFuturePointInTime(generationDuration);
+		this.endInfinite = (generationDuration == 0);
+		this.eventSourceIdCounter = 0;
+		this.eventSourceIds = new HashMap<String, Integer>();
+		this.nextEventSource = new LinkedList<EventOccurrence>();
+	}
+	
+	/**
+	 * @return the endInfinite
+	 */
+	public boolean isEndInfinite() {
+		return endInfinite;
+	}
+	
+	// add source which will generate events from current clock time on, possibly forever (i.e. no boundaries)
+	public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur){
+		return addEventSource (id, ev, minOccur, avgOccur, 0, 0);
+	}
+	
+	// add source which will generate events from current clock time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
+	public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur, long maxDuration, int maxItems){
+		if (!eventSourceIds.containsKey(id)){
+			this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
+			EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, this.myClock.getCurrentTime(), maxDuration, maxItems);
+			this.nextEventSource.add (evOcc);
+			return evOcc;
+		}
+		return null;
+	}
+	
+	// add source which will generate events from the given start time on, possibly forever (i.e. no boundaries)
+	public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime){
+		return addDelayedEventSource (id, ev, minOccur, avgOccur, startTime, 0, 0);
+	}
+	
+	// add source which will generate events from the given start time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
+	public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime, long maxDuration, int maxItems){
+		if (!eventSourceIds.containsKey(id)){
+			this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
+			EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, startTime, maxDuration, maxItems);
+			this.nextEventSource.add (evOcc);
+			return evOcc;
+		}
+		return null;
+	}
+	
+	public void removeEventSource(String id){
+		Integer hashValue = eventSourceIds.get(id);
+		if (hashValue != null){
+			this.nextEventSource.remove(hashValue.intValue());
+			this.eventSourceIds.remove(id);
+			this.eventSourceIdCounter--;
+		}
+	}
+	
+	public static void sendGeneratedEvent(Event ev){
+		sendListener.generatedEventSent(ev);
+	}
+	
+
+	public void generate() {
+		EventOccurrence currentEGT;
+		Event currentEvent;
+		
+		//sort all events according to their first occurrence
+		Collections.sort(nextEventSource, new EventGenerationTimeComparator());
+		
+		// simulate ongoing simulation time and upcoming events
+		while (!nextEventSource.isEmpty()) {
+			
+			// get next event generation time from queue
+			currentEGT = nextEventSource.removeFirst();
+			currentEvent = (Event)currentEGT.getEvent().clone();
+			
+			// advance clock to time of currentEGT 
+			myClock.setTime(currentEGT.getNextOccurrenceTime());
+			
+			// send event corresponding to currentEGT
+			sendGeneratedEvent(currentEvent);
+			//System.out.println ("Sender "+currentEGT.getEventSenderId() + ": Sent "+currentEvent.getEventId()+" event for parent id " + currentEvent.getParentId() + " at " + Tools.formattedDate(currentEGT.getNextOccurrenceTime()));
+			
+			//update clock in working memory in order being able to process time sensitive rules
+			wm.update(clockHandle, myClock);
+			
+			// determine new event generation time for this event type
+			boolean occIsValid = currentEGT.calculateNextEventOccurrence();
+			// add the new generation time to the right position in the queue, 
+			// but only if the generated event met its local restrictions plus
+			// it is going to occur within the global time boundaries (or there are no such boundaries, respectively)
+			if (occIsValid && (isEndInfinite() || currentEGT.getNextOccurrenceTime() < this.generationEndTime)) {
+				int index = Collections.binarySearch(nextEventSource, currentEGT, new EventGenerationTimeComparator());
+				if (index < 0)
+					nextEventSource.add(-index-1, currentEGT);
+			}
+			//session.out.print ("\nQueue nach Bearbeitung: ");
+			//for (int i = 0; i < nextEventSource.size(); i++)
+			//	session.out.print (Tools.formattedDate(nextEventSource.get(i).getGenerationTime())+"\""+nextEventSource.get(i).getEventSenderId()+"; ");
+
+		};
+		
+		//System.out.println ("\nSending of messages finished");
+	}
+	
+}
+
+class EventOccurrence{
+	
+	private static Random myRandom = new Random();;
+	
+	private String eventSenderId;
+	private Event event;
+	private long evDeviation, evMinDur;
+	private int itemCounter, maxItems;
+	private long latestEnd;
+	private boolean infinite;
+	
+	public EventOccurrence(String eventSenderId, Event ev, long evMinDur, long avgOccur, long earliestStart, long maxDuration, int maxItems) {
+		this.eventSenderId = eventSenderId;
+		this.evMinDur = evMinDur;
+		this.evDeviation = 2*(avgOccur-evMinDur); 
+		
+		this.event = ev;
+		this.event.setTimes(earliestStart);
+		this.latestEnd = earliestStart+maxDuration;
+		this.maxItems = maxItems;
+		this.itemCounter = 0;
+		this.infinite = maxDuration<=0;
+		calculateNextEventOccurrence();
+	}
+
+	// returns true if event source has no boundaries or all restrictions (i.e. a generation duration or max. number of event instances) are met, false otherwise
+	public boolean calculateNextEventOccurrence (){
+		this.event.setTimes(this.event.getEndTime()+myRandom.nextInt((int)this.evDeviation)+this.evMinDur);
+		if (maxItems <=0){
+			if (isInfinite())
+				return true;
+			else return event.getEndTime()<this.latestEnd;
+			}
+			else {
+				this.itemCounter++;
+				if (this.itemCounter>this.maxItems)
+					return false;
+				if (isInfinite())
+					return true;
+				else return (event.getEndTime()<this.latestEnd);
+			}
+	}
+	
+	/**
+	 * @return the infinite
+	 */
+	private boolean isInfinite() {
+		return infinite;
+	}
+	
+	/**
+	 * @return the eventSenderId
+	 */
+	public String getEventSenderId() {
+		return eventSenderId;
+	}
+
+	/**
+	 * @return the time
+	 */
+	public long getNextOccurrenceTime() {
+		return this.event.getEndTime();
+	}
+
+	/**
+	 * @return the event
+	 */
+	public Event getEvent() {
+		return event;
+	}
+	
+}
+
+class EventGenerationTimeComparator implements Comparator<EventOccurrence>{
+
+	public int compare(EventOccurrence o1, EventOccurrence o2) {
+		return (int)(o1.getNextOccurrenceTime()-o2.getNextOccurrenceTime());
+	}
+	
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,168 +0,0 @@
-package org.drools.integrationtests.eventgenerator;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.drools.RuleBase;
-import org.drools.RuleBaseFactory;
-import org.drools.WorkingMemory;
-import org.drools.compiler.DrlParser;
-import org.drools.compiler.DroolsParserException;
-import org.drools.compiler.PackageBuilder;
-import org.drools.integrationtests.eventgenerator.Event.EventType;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.rule.Package;
-
-
-public class SimpleEventGeneratorTest extends TestCase {
-	
-	private final static String TEST_RULE_FILE = "test_eventGenerator.drl";
-	
-	protected RuleBase getRuleBase() throws Exception {
-
-        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                            null );
-    }
-	
-	private RuleBase loadRuleBase(final Reader reader) throws IOException,
-	    DroolsParserException,
-	    Exception {
-		final DrlParser parser = new DrlParser();
-		final PackageDescr packageDescr = parser.parse( reader );
-		if ( parser.hasErrors() ) {
-			System.out.println( parser.getErrors() );
-			Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
-		}
-		// pre build the package
-		final PackageBuilder builder = new PackageBuilder();
-		builder.addPackage( packageDescr );
-		final Package pkg = builder.getPackage();
-	
-		// add the package to a rulebase
-		final RuleBase ruleBase = getRuleBase();
-		ruleBase.addPackage( pkg );
-		// load up the rulebase
-		return ruleBase;
-	}
-    
-	public void testEventGenerationMaxItems() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate 10 events, starting from the session clock
-		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 10);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), 10);
-	}
-	
-	public void testEventGenerationMaxTime() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate events for 1 min, starting from the session clock
-		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 0);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
-	}
-	
-	public void testEventGenerationMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate at most 10 events not exceeding 1 min, starting from the session clock
-		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 10);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
-		assertTrue(wm.getQueryResults("all inserted events with generation time < 1 min").size()<=10);
-	}
-	
-	public void testEventGenerationDelayedMaxItems() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate 10 events, delayed by 2 minutes from start session clock 
-		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), 0, 10);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), 10);
-	}
-	
-	public void testEventGenerationDelayedMaxTime() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate events for 1 min, delayed by 2 minutes from start session clock
-		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 0);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
-	}
-	
-	public void testEventGenerationDelayedMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate at most 10 events not exceeding 1 min, delayed by 2 minutes from start session clock
-		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 10);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
-		assertTrue(wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size()<=10);
-	}
-	
-	public void testEventGenerationGlobalMaxTime() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm), PseudoSessionClock.timeInMinutes(1));
-		// generate events for 1 min, starting from the session clock
-		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(3), 0);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
-	}
-	
-	public void testEventGenerationMultipleSources() throws DroolsParserException, IOException, Exception{
-		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
-        final RuleBase ruleBase = loadRuleBase( reader );
-		final WorkingMemory wm = ruleBase.newStatefulSession();
-		final SimpleEventGenerator myGenerator;
-		
-		// create unrestricted event generator
-		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
-		// generate 15 events with parent resource A and 20 events with parent resource B
-		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, "resA"), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 15);
-		myGenerator.addEventSource("Conveyor2", new Event(EventType.CUSTOM, "resB"), PseudoSessionClock.timeInSeconds(3), PseudoSessionClock.timeInSeconds(5), 0, 20);
-		myGenerator.generate();
-		assertEquals(wm.getQueryResults("all inserted events with parent resource A").size(), 15);
-		assertEquals(wm.getQueryResults("all inserted events with parent resource B").size(), 20);
-	}
-	
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,168 @@
+package org.drools.integrationtests.eventgenerator;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilder;
+import org.drools.integrationtests.eventgenerator.Event.EventType;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.rule.Package;
+
+
+public class SimpleEventGeneratorTest extends TestCase {
+	
+	private final static String TEST_RULE_FILE = "test_eventGenerator.drl";
+	
+	protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+	
+	private RuleBase loadRuleBase(final Reader reader) throws IOException,
+	    DroolsParserException,
+	    Exception {
+		final DrlParser parser = new DrlParser();
+		final PackageDescr packageDescr = parser.parse( reader );
+		if ( parser.hasErrors() ) {
+			System.out.println( parser.getErrors() );
+			Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
+		}
+		// pre build the package
+		final PackageBuilder builder = new PackageBuilder();
+		builder.addPackage( packageDescr );
+		final Package pkg = builder.getPackage();
+	
+		// add the package to a rulebase
+		final RuleBase ruleBase = getRuleBase();
+		ruleBase.addPackage( pkg );
+		// load up the rulebase
+		return ruleBase;
+	}
+    
+	public void testEventGenerationMaxItems() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate 10 events, starting from the session clock
+		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 10);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), 10);
+	}
+	
+	public void testEventGenerationMaxTime() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate events for 1 min, starting from the session clock
+		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 0);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+	}
+	
+	public void testEventGenerationMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate at most 10 events not exceeding 1 min, starting from the session clock
+		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 10);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+		assertTrue(wm.getQueryResults("all inserted events with generation time < 1 min").size()<=10);
+	}
+	
+	public void testEventGenerationDelayedMaxItems() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate 10 events, delayed by 2 minutes from start session clock 
+		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), 0, 10);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), 10);
+	}
+	
+	public void testEventGenerationDelayedMaxTime() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate events for 1 min, delayed by 2 minutes from start session clock
+		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 0);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
+	}
+	
+	public void testEventGenerationDelayedMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate at most 10 events not exceeding 1 min, delayed by 2 minutes from start session clock
+		myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 10);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
+		assertTrue(wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size()<=10);
+	}
+	
+	public void testEventGenerationGlobalMaxTime() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm), PseudoSessionClock.timeInMinutes(1));
+		// generate events for 1 min, starting from the session clock
+		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(3), 0);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+	}
+	
+	public void testEventGenerationMultipleSources() throws DroolsParserException, IOException, Exception{
+		final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+        final RuleBase ruleBase = loadRuleBase( reader );
+		final WorkingMemory wm = ruleBase.newStatefulSession();
+		final SimpleEventGenerator myGenerator;
+		
+		// create unrestricted event generator
+		myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+		// generate 15 events with parent resource A and 20 events with parent resource B
+		myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, "resA"), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 15);
+		myGenerator.addEventSource("Conveyor2", new Event(EventType.CUSTOM, "resB"), PseudoSessionClock.timeInSeconds(3), PseudoSessionClock.timeInSeconds(5), 0, 20);
+		myGenerator.generate();
+		assertEquals(wm.getQueryResults("all inserted events with parent resource A").size(), 15);
+		assertEquals(wm.getQueryResults("all inserted events with parent resource B").size(), 20);
+	}
+	
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,28 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator;
-
-import org.drools.WorkingMemory;
-
-
-/**
- * @author Matthias Groch
- *
- */
-public class SimpleEventListener extends AbstractEventListener {
-
-	public SimpleEventListener(WorkingMemory wm) {
-		super(wm);
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see com.event.AbstractEventListener#generatedEventSent(com.event.Event)
-	 */
-	@Override
-	public void generatedEventSent(Event e) {
-		addEventToWM(e);
-	}
-
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,28 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import org.drools.WorkingMemory;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class SimpleEventListener extends AbstractEventListener {
+
+	public SimpleEventListener(WorkingMemory wm) {
+		super(wm);
+		// TODO Auto-generated constructor stub
+	}
+
+	/* (non-Javadoc)
+	 * @see com.event.AbstractEventListener#generatedEventSent(com.event.Event)
+	 */
+	@Override
+	public void generatedEventSent(Event e) {
+		addEventToWM(e);
+	}
+
+}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example)

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,129 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-/**
- * @author Matthias Groch
- *
- */
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-
-import org.drools.RuleBase;
-import org.drools.RuleBaseFactory;
-import org.drools.WorkingMemory;
-import org.drools.compiler.DroolsParserException;
-import org.drools.compiler.PackageBuilder;
-import org.drools.integrationtests.eventgenerator.PseudoSessionClock;
-import org.drools.integrationtests.eventgenerator.SimpleEventGenerator;
-import org.drools.integrationtests.eventgenerator.SimpleEventListener;
-import org.drools.rule.Package;
-
-
-public class ExampleScenario {
-	
-	// constants
-	public final static String FILE_NAME_RULES = "../example_scenario.drl";
-	//public final static String FILE_NAME_LOGGER = "log/event";
-	private static int NUMBER_RESOURCES = 3;
-	
-	// event occurrence probabilities 
-	public final static int AVG_OCCUR_PRODUCTION_EVENT = 7000; // average time in milliseconds after which another item is manufactured by one resource; default: 700 ms
-	public final static int MIN_OCCUR_PRODUCTION_EVENT = 4000; // minimum time in milliseconds after which another item is manufactured by one resource; default: 700 ms
-	public final static int AVG_OCCUR_HEARTBEAT_EVENT = 90000; // average time in milliseconds after which a resource sends another heartbeat; default: 60000 ms
-	public final static int MIN_OCCUR_HEARTBEAT_EVENT = 45000; // average time in milliseconds after which a resource sends another heartbeat; default: 60000 ms
-	public final static int AVG_OCCUR_ALERT_EVENT = 1800000; // average time in milliseconds after which an alarm is sent; default: 1800000 = 30 mis
-	public final static int MIN_OCCUR_ALERT_EVENT = 0; // average time in milliseconds after which an alarm is sent; default: 1800000 = 30 mis
-	
-	private static WorkingMemory wm;
-	//private static WorkingMemoryFileLogger logger;
-	
-	public static void setup(){
-		// read in the source
-		Reader source = new InputStreamReader (ExampleScenario.class.getResourceAsStream(FILE_NAME_RULES));
-		// Use package builder to build up a rule package.
-		// An alternative lower level class called DrlParser can also be used ...
-		PackageBuilder builder = new PackageBuilder();
-		// this will parse and compile in one step
-		// NOTE: There are 2 methods here, the one argument one is for normal DRL.
-		try {
-				builder.addPackageFromDrl(source);
-		} catch (DroolsParserException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		// get the compiled package (which is serializable)
-		Package pkg = builder.getPackage();
-		
-		// add defined object types
-		//FactTemplate ftEvent = new FactTemplateImpl();
-		//pkg.addFactTemplate(ftEvent);
-		
-		//	add the package to a rulebase (deploy the rule package).
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-		try {
-			ruleBase.addPackage (pkg);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		wm = ruleBase.newStatefulSession();
-		// create a new Working Memory Logger, that logs to file.
-	    //logger = new WorkingMemoryFileLogger(wm);
-	    // an event.log file is created in the log dir (which must exist)
-	    // in the working directory
-	    //logger.setFileName(FILE_NAME_LOGGER);
-	}
-	
-	public static final void main (String[] args) {
-		   
-		setup();
-		
-		System.out.println("Waiting for messages...");
-        System.out.println("Press [return] to quit\n");
-        
-        ArrayList<Resource> resources = new ArrayList<Resource>();
-        
-        // 
-        SimpleEventGenerator myGenerator =  new SimpleEventGenerator(wm, new SimpleEventListener(wm), PseudoSessionClock.timeInMinutes(15));
-        
-        //create fab resources and add them to working memory
-		for (int i = 0; i < NUMBER_RESOURCES; i++){
-			
-			Resource res = new Resource("mach"+i);
-			resources.add(res);
-			wm.insert(res.getOpStatus());
-			
-			SlidingWindow sw = new SlidingWindow(0, res.getId(), PseudoSessionClock.timeInMinutes(10), PseudoSessionClock.timeInMinutes(2));
-			//GlobalWorkingMemory.getInstance().insert(new Event(Event.SLIDING_WINDOW, res.getId(), systemTime, systemTime));
-			wm.insert(sw);
-			
-			// add eventSenders to EventGenerator
-			myGenerator.addEventSource("Conveyor"+i, new ProductionEvent(res.getId()), MIN_OCCUR_PRODUCTION_EVENT, AVG_OCCUR_PRODUCTION_EVENT, 0, 0);
-		}
-		
-		// start generating events
-        myGenerator.generate();
-        
-        BufferedReader waiter = new BufferedReader(new InputStreamReader(System.in));
-        try {
-			waiter.readLine();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-        // stop logging
-        //logger.writeToDisk();
-        //System.out.println("Application terminated - Audit log written to disk");
-	
-	}
-		
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ExampleScenario.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,129 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilder;
+import org.drools.integrationtests.eventgenerator.PseudoSessionClock;
+import org.drools.integrationtests.eventgenerator.SimpleEventGenerator;
+import org.drools.integrationtests.eventgenerator.SimpleEventListener;
+import org.drools.rule.Package;
+
+
+public class ExampleScenario {
+	
+	// constants
+	public final static String FILE_NAME_RULES = "../example_scenario.drl";
+	//public final static String FILE_NAME_LOGGER = "log/event";
+	private static int NUMBER_RESOURCES = 3;
+	
+	// event occurrence probabilities 
+	public final static int AVG_OCCUR_PRODUCTION_EVENT = 7000; // average time in milliseconds after which another item is manufactured by one resource; default: 700 ms
+	public final static int MIN_OCCUR_PRODUCTION_EVENT = 4000; // minimum time in milliseconds after which another item is manufactured by one resource; default: 700 ms
+	public final static int AVG_OCCUR_HEARTBEAT_EVENT = 90000; // average time in milliseconds after which a resource sends another heartbeat; default: 60000 ms
+	public final static int MIN_OCCUR_HEARTBEAT_EVENT = 45000; // average time in milliseconds after which a resource sends another heartbeat; default: 60000 ms
+	public final static int AVG_OCCUR_ALERT_EVENT = 1800000; // average time in milliseconds after which an alarm is sent; default: 1800000 = 30 mis
+	public final static int MIN_OCCUR_ALERT_EVENT = 0; // average time in milliseconds after which an alarm is sent; default: 1800000 = 30 mis
+	
+	private static WorkingMemory wm;
+	//private static WorkingMemoryFileLogger logger;
+	
+	public static void setup(){
+		// read in the source
+		Reader source = new InputStreamReader (ExampleScenario.class.getResourceAsStream(FILE_NAME_RULES));
+		// Use package builder to build up a rule package.
+		// An alternative lower level class called DrlParser can also be used ...
+		PackageBuilder builder = new PackageBuilder();
+		// this will parse and compile in one step
+		// NOTE: There are 2 methods here, the one argument one is for normal DRL.
+		try {
+				builder.addPackageFromDrl(source);
+		} catch (DroolsParserException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		// get the compiled package (which is serializable)
+		Package pkg = builder.getPackage();
+		
+		// add defined object types
+		//FactTemplate ftEvent = new FactTemplateImpl();
+		//pkg.addFactTemplate(ftEvent);
+		
+		//	add the package to a rulebase (deploy the rule package).
+		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+		try {
+			ruleBase.addPackage (pkg);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		wm = ruleBase.newStatefulSession();
+		// create a new Working Memory Logger, that logs to file.
+	    //logger = new WorkingMemoryFileLogger(wm);
+	    // an event.log file is created in the log dir (which must exist)
+	    // in the working directory
+	    //logger.setFileName(FILE_NAME_LOGGER);
+	}
+	
+	public static final void main (String[] args) {
+		   
+		setup();
+		
+		System.out.println("Waiting for messages...");
+        System.out.println("Press [return] to quit\n");
+        
+        ArrayList<Resource> resources = new ArrayList<Resource>();
+        
+        // 
+        SimpleEventGenerator myGenerator =  new SimpleEventGenerator(wm, new SimpleEventListener(wm), PseudoSessionClock.timeInMinutes(15));
+        
+        //create fab resources and add them to working memory
+		for (int i = 0; i < NUMBER_RESOURCES; i++){
+			
+			Resource res = new Resource("mach"+i);
+			resources.add(res);
+			wm.insert(res.getOpStatus());
+			
+			SlidingWindow sw = new SlidingWindow(0, res.getId(), PseudoSessionClock.timeInMinutes(10), PseudoSessionClock.timeInMinutes(2));
+			//GlobalWorkingMemory.getInstance().insert(new Event(Event.SLIDING_WINDOW, res.getId(), systemTime, systemTime));
+			wm.insert(sw);
+			
+			// add eventSenders to EventGenerator
+			myGenerator.addEventSource("Conveyor"+i, new ProductionEvent(res.getId()), MIN_OCCUR_PRODUCTION_EVENT, AVG_OCCUR_PRODUCTION_EVENT, 0, 0);
+		}
+		
+		// start generating events
+        myGenerator.generate();
+        
+        BufferedReader waiter = new BufferedReader(new InputStreamReader(System.in));
+        try {
+			waiter.readLine();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+        // stop logging
+        //logger.writeToDisk();
+        //System.out.println("Application terminated - Audit log written to disk");
+	
+	}
+		
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,33 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import org.drools.integrationtests.eventgenerator.Event;
-
-/**
- * @author Matthias Groch
- *
- */
-public class FailureEvent extends Event {
-	
-	/**
-	 * Special constructor for a failure event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 */
-	public FailureEvent(String parentId) {
-		super(EventType.FAILURE, parentId);
-	}
-	
-	/**
-	 * Special constructor for a faliure event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 * @param parameters The event parameters.
-	 */
-	public FailureEvent(String parentId, long start, long end) {
-		super(EventType.FAILURE, parentId, start, end);
-	}
-
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/FailureEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,33 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import org.drools.integrationtests.eventgenerator.Event;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class FailureEvent extends Event {
+	
+	/**
+	 * Special constructor for a failure event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 */
+	public FailureEvent(String parentId) {
+		super(EventType.FAILURE, parentId);
+	}
+	
+	/**
+	 * Special constructor for a faliure event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 * @param parameters The event parameters.
+	 */
+	public FailureEvent(String parentId, long start, long end) {
+		super(EventType.FAILURE, parentId, start, end);
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,33 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import org.drools.integrationtests.eventgenerator.Event;
-
-
-/**
- * @author Matthias Groch
- *
- */
-public class HeartbeatEvent extends Event {
-	
-	/**
-	 * Special constructor for a heartbeat event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 */
-	public HeartbeatEvent(String parentId) {
-		super(EventType.HEARTBEAT, parentId);
-	}
-	
-	/**
-	 * Special constructor for a heartbeat event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 * @param parameters The event parameters.
-	 */
-	public HeartbeatEvent(String parentId, long start, long end) {
-		super(EventType.HEARTBEAT, parentId, start, end);
-	}
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/HeartbeatEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,33 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import org.drools.integrationtests.eventgenerator.Event;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class HeartbeatEvent extends Event {
+	
+	/**
+	 * Special constructor for a heartbeat event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 */
+	public HeartbeatEvent(String parentId) {
+		super(EventType.HEARTBEAT, parentId);
+	}
+	
+	/**
+	 * Special constructor for a heartbeat event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 * @param parameters The event parameters.
+	 */
+	public HeartbeatEvent(String parentId, long start, long end) {
+		super(EventType.HEARTBEAT, parentId, start, end);
+	}
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,32 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import org.drools.integrationtests.eventgenerator.Event;
-
-/**
- * @author Matthias Groch
- *
- */
-public class ProductionEvent extends Event {
-	
-	/**
-	 * Special constructor for a production event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 */
-	public ProductionEvent(String parentId) {
-		super(EventType.PRODUCTION, parentId);
-	}
-	
-	/**
-	 * Special constructor for a production event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 * @param parameters The event parameters.
-	 */
-	public ProductionEvent(String parentId, long start, long end) {
-		super(EventType.PRODUCTION, parentId, start, end);
-	}
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/ProductionEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import org.drools.integrationtests.eventgenerator.Event;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class ProductionEvent extends Event {
+	
+	/**
+	 * Special constructor for a production event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 */
+	public ProductionEvent(String parentId) {
+		super(EventType.PRODUCTION, parentId);
+	}
+	
+	/**
+	 * Special constructor for a production event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 * @param parameters The event parameters.
+	 */
+	public ProductionEvent(String parentId, long start, long end) {
+		super(EventType.PRODUCTION, parentId, start, end);
+	}
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,121 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import java.util.Calendar;
-
-/**
- * @author Matthias Groch
- *
- */
-public class Resource {
-	
-	public static final String[] OPERATIONAL_STATUS_VALUES = {"RED", "YELLOW", "GREEN"};
-	
-	public static final int STATUS_RED = 0;
-	public static final int STATUS_YELLOW = 1;
-	public static final int STATUS_GREEN = 2;
-	
-	private static int idCounter = 0;
-	
-	private String id;
-	private String name;
-	private double pressure, temperature;
-	private Calendar lastHeartBeat;
-	private Status opStatus;
-	
-	public Resource(String name) {
-		this.id = String.valueOf(idCounter++);
-		this.name = name;
-		this.pressure = 0;
-		this.temperature = 0;
-		this.lastHeartBeat = null;
-		this.opStatus = new Status(Status.OPERATIONAL, this.id, OPERATIONAL_STATUS_VALUES, STATUS_RED);
-	}
-
-	/**
-	 * @return the id
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @param id the id to set
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * @return the resource type
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param type the resource type to set
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * @return the opStatus
-	 */
-	public Status getOpStatus() {
-		return opStatus;
-	}
-
-	/**
-	 * @param opStatus the opStatus to set
-	 */
-	public void setOpStatus(Status status) {
-		this.opStatus = status;
-	}
-
-	/**
-	 * @return the pressure
-	 */
-	public double getPressure() {
-		return pressure;
-	}
-
-	/**
-	 * @param pressure the pressure to set
-	 */
-	public void setPressure(double pressure) {
-		this.pressure = pressure;
-	}
-
-	/**
-	 * @return the temperature
-	 */
-	public double getTemperature() {
-		return temperature;
-	}
-
-	/**
-	 * @param temperature the temperature to set
-	 */
-	public void setTemperature(double temperature) {
-		this.temperature = temperature;
-	}
-
-	/**
-	 * @return the lastHeartBeat
-	 */
-	public Calendar getLastHeartBeat() {
-		return lastHeartBeat;
-	}
-
-	/**
-	 * @param lastHeartBeat the lastHeartBeat to set
-	 */
-	public void setLastHeartBeat(Calendar lastHeartBeat) {
-		this.lastHeartBeat = lastHeartBeat;
-	}
-
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Resource.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,121 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import java.util.Calendar;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class Resource {
+	
+	public static final String[] OPERATIONAL_STATUS_VALUES = {"RED", "YELLOW", "GREEN"};
+	
+	public static final int STATUS_RED = 0;
+	public static final int STATUS_YELLOW = 1;
+	public static final int STATUS_GREEN = 2;
+	
+	private static int idCounter = 0;
+	
+	private String id;
+	private String name;
+	private double pressure, temperature;
+	private Calendar lastHeartBeat;
+	private Status opStatus;
+	
+	public Resource(String name) {
+		this.id = String.valueOf(idCounter++);
+		this.name = name;
+		this.pressure = 0;
+		this.temperature = 0;
+		this.lastHeartBeat = null;
+		this.opStatus = new Status(Status.OPERATIONAL, this.id, OPERATIONAL_STATUS_VALUES, STATUS_RED);
+	}
+
+	/**
+	 * @return the id
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @param id the id to set
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return the resource type
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param type the resource type to set
+	 */
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * @return the opStatus
+	 */
+	public Status getOpStatus() {
+		return opStatus;
+	}
+
+	/**
+	 * @param opStatus the opStatus to set
+	 */
+	public void setOpStatus(Status status) {
+		this.opStatus = status;
+	}
+
+	/**
+	 * @return the pressure
+	 */
+	public double getPressure() {
+		return pressure;
+	}
+
+	/**
+	 * @param pressure the pressure to set
+	 */
+	public void setPressure(double pressure) {
+		this.pressure = pressure;
+	}
+
+	/**
+	 * @return the temperature
+	 */
+	public double getTemperature() {
+		return temperature;
+	}
+
+	/**
+	 * @param temperature the temperature to set
+	 */
+	public void setTemperature(double temperature) {
+		this.temperature = temperature;
+	}
+
+	/**
+	 * @return the lastHeartBeat
+	 */
+	public Calendar getLastHeartBeat() {
+		return lastHeartBeat;
+	}
+
+	/**
+	 * @param lastHeartBeat the lastHeartBeat to set
+	 */
+	public void setLastHeartBeat(Calendar lastHeartBeat) {
+		this.lastHeartBeat = lastHeartBeat;
+	}
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,312 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-/**
- * @author Matthias Groch
- *
- */
-public class SlidingWindow {
-	
-	// Sliding window states names
-	public static final String[] SW_STATES = {"Default", "Collecting", "Evaluating", "Advancing"};
-	
-	public static final int DEFAULT = 0;
-	public static final int COLLECT = 1;
-	public static final int EVALUATE = 2;
-	public static final int ADVANCE = 3;
-	
-	private static int idCounter = 0;
-	
-	private int id, state;
-	private boolean readyToEvaluate;
-	private String parentId;
-	private long windowStart, windowEnd, lastUpdate;
-	private long windowLength, windowShift;
-	//private List<Event> eventsInWindow;
-	int numberEvents;
-	/*private int defectiveFridgesCount, defectiveFreezersCount;
-	private int workingFridgesCount, workingFreezersCount;*/
-	
-	public SlidingWindow(long wStart, String parentId, long windowLength, long windowShift) {
-		this.id = idCounter++;
-		this.readyToEvaluate = false;
-		this.state = DEFAULT;
-		this.parentId = parentId;
-		this.windowStart = wStart;
-		this.windowEnd = this.windowStart + windowLength;
-		this.lastUpdate = wStart;
-		this.windowLength = windowLength;
-		this.windowShift = windowShift;
-		//this.eventsInWindow = new ArrayList<Event>();
-		this.numberEvents = 0;
-		//System.out.println ("Sliding window "+this.id+" expires at "+Tools.formattedDate(this.windowEnd));
-	}
-
-	/**
-	 * @return the id
-	 */
-	public String getId() {
-		return "sw"+id;
-	}
-	
-	public long getWindowStart() {
-		return windowStart;
-	}
-	
-	public void setWindowStart(long start) {
-		this.windowStart = start;
-	}
-	
-	public long getWindowEnd() {
-		return windowEnd;
-	}
-	
-	public void setWindowEnd(long end) {
-		this.windowEnd = end;
-	}
-
-	/**
-	 * @return the windowLength
-	 */
-	public long getWindowLength() {
-		return windowLength;
-	}
-
-	/**
-	 * @param windowLength the windowLength to set
-	 */
-	public void setWindowLength(int windowLength) {
-		this.windowLength = windowLength;
-	}
-
-	/**
-	 * @return the shift
-	 */
-	public long getWindowShift() {
-		return windowShift;
-	}
-
-	/**
-	 * @param shift the shift to set
-	 */
-	public void setShift(int windowShift) {
-		this.windowShift = windowShift;
-	}
-
-	/**
-	 * @return the numberEvents
-	 */
-	public int getNumberEvents() {
-		return numberEvents;
-	}
-	
-	/**
-	 * @param numberEvents the numberEvents to set
-	 */
-	public void setNumberEvents(int numberEvents) {
-		this.numberEvents = numberEvents;
-	}
-	
-/*	*//**
-	 * @return the eventsInWindow
-	 *//*
-	public int getNumberEventsInWindow() {
-		return this.eventsInWindow.size();
-	}
-
-	*//**
-	 * @return the eventsInWindow
-	 *//*
-	public List<Event> getEventsInWindow() {
-		return eventsInWindow;
-	}
-	
-	*//**
-	 * @param eventsInWindow the eventsInWindow to set
-	 *//*
-	public void setEventsInWindow(List<Event> eventsInWindow) {
-		this.eventsInWindow = eventsInWindow;
-	}
-	
-	*//**
-	 * @param additionalEventsInWindow the additional events in window to add
-	 *//*
-	public void addEventsInWindow(List<Event> additionalEventsInWindow) {
-		this.eventsInWindow.addAll(additionalEventsInWindow);
-	}
-	
-	*//**
-	 * @param expiredEventsInWindow the events in window to remove
-	 *//*
-	public void removeEventsInWindow(List<Event> expiredEventsInWindow) {
-		this.eventsInWindow.removeAll(expiredEventsInWindow);
-	}*/
-
-	/**
-	 * @return the parentId
-	 */
-	public String getParentId() {
-		return parentId;
-	}
-
-	/**
-	 * @param parentId the parentId to set
-	 */
-	public void setParentId(String parentId) {
-		this.parentId = parentId;
-	}
-	
-	/**
-	 * Advances the sliding window
-	 */
-	public void advance() {
-		this.windowStart += this.windowShift;
-		this.windowEnd += this.windowShift;
-		//System.out.println ("Sliding window "+this.getId()+" is reset to "+Tools.formattedInterval(this.windowStart, this.windowEnd));
-	}
-
-	/**
-	 * @return the lastUpdate
-	 */
-	public long getLastUpdate() {
-		return lastUpdate;
-	}
-
-	/**
-	 * @param lastUpdate the lastUpdate to set
-	 */
-	public void setLastUpdate(long lastUpdate) {
-		this.lastUpdate = lastUpdate;
-	}
-
-	/**
-	 * @return the state
-	 */
-	public int getState() {
-		return state;
-	}
-
-	/**
-	 * @param state the state to set
-	 */
-	public void setState(int state) {
-		this.state = state;
-	}
-
-	/**
-	 * @return the readyForAction
-	 */
-	public boolean isReadyToEvaluate() {
-		return readyToEvaluate;
-	}
-
-	/**
-	 * @param readyForAction the readyForAction to set
-	 */
-	public void setReadyToEvaluate(boolean readyToEvaluate) {
-		this.readyToEvaluate = readyToEvaluate;
-	}
-	
-	/**
-	 * @return the workingFreezersCount
-	 *//*
-	public int getWorkingFreezersCount() {
-		return workingFreezersCount;
-	}
-
-	*//**
-	 * @param workingFreezersCount the workingFreezersCount to set
-	 *//*
-	public void setWorkingFreezersCount(int workingFreezersCount) {
-		this.workingFreezersCount = workingFreezersCount;
-	}
-
-	*//**
-	 * @return the workingFridgesCount
-	 *//*
-	public int getWorkingFridgesCount() {
-		return workingFridgesCount;
-	}
-
-	*//**
-	 * @param workingFridgesCount the workingFridgesCount to set
-	 *//*
-	public void setWorkingFridgesCount(int workingFridgesCount) {
-		this.workingFridgesCount = workingFridgesCount;
-	}
-
-	public int getDefectiveFridgesCount() {
-		return defectiveFridgesCount;
-	}
-	
-	public void setDefectiveFridgesCount(int defectiveFridgesCount) {
-		this.defectiveFridgesCount = defectiveFridgesCount;
-	}
-
-	public int getDefectiveFreezersCount() {
-		return defectiveFreezersCount;
-	}
-
-	public void setDefectiveFreezersCount(int defectiveFreezersCount) {
-		this.defectiveFreezersCount = defectiveFreezersCount;
-	}
-	
-	public int getWorkingDevicesCount() {
-		return workingFridgesCount+workingFreezersCount;
-	}
-	
-	public int getDefectiveDevicesCount() {
-		return defectiveFridgesCount+defectiveFreezersCount;
-	}
-	
-	public int getOverallFridgesCount() {
-		return getWorkingFridgesCount()+getDefectiveFridgesCount();
-	}
-	
-	public int getOverallFreezersCount() {
-		return getWorkingFreezersCount()+getDefectiveFreezersCount();
-	}
-	
-	public int getOverallDevicesCount() {
-		return getWorkingDevicesCount()+getDefectiveDevicesCount();
-	}
-	
-	public double getWorkingFridgesRatio() {
-		if (getOverallFridgesCount() == 0)
-			return 0;
-		return (double)getWorkingFridgesCount()/getOverallFridgesCount();
-	}
-	
-	public double getDefectiveFridgesRatio() {
-		if (getOverallFridgesCount() == 0)
-			return 0;
-		return (double)getDefectiveFridgesCount()/getOverallFridgesCount();
-	}
-	
-	public double getWorkingFreezersRatio() {
-		if (getOverallFreezersCount() == 0)
-			return 0;
-		return (double)getWorkingFreezersCount()/getOverallFreezersCount();
-	}
-	
-	public double getDefectiveFreezersRatio() {
-		if (getOverallFreezersCount() == 0)
-			return 0;
-		return (double)getDefectiveFreezersCount()/getOverallFreezersCount();
-	}
-	
-	public double getWorkingDevicesRatio() {
-		if (getOverallDevicesCount() == 0)
-			return 0;
-		return (double)getWorkingDevicesCount()/getOverallDevicesCount();
-	}
-	
-	public double getDefectiveDevicesRatio() {
-		if (getOverallDevicesCount() == 0)
-			return 0;
-		return (double)getDefectiveDevicesCount()/getOverallDevicesCount();
-	}*/
-
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/SlidingWindow.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,312 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class SlidingWindow {
+	
+	// Sliding window states names
+	public static final String[] SW_STATES = {"Default", "Collecting", "Evaluating", "Advancing"};
+	
+	public static final int DEFAULT = 0;
+	public static final int COLLECT = 1;
+	public static final int EVALUATE = 2;
+	public static final int ADVANCE = 3;
+	
+	private static int idCounter = 0;
+	
+	private int id, state;
+	private boolean readyToEvaluate;
+	private String parentId;
+	private long windowStart, windowEnd, lastUpdate;
+	private long windowLength, windowShift;
+	//private List<Event> eventsInWindow;
+	int numberEvents;
+	/*private int defectiveFridgesCount, defectiveFreezersCount;
+	private int workingFridgesCount, workingFreezersCount;*/
+	
+	public SlidingWindow(long wStart, String parentId, long windowLength, long windowShift) {
+		this.id = idCounter++;
+		this.readyToEvaluate = false;
+		this.state = DEFAULT;
+		this.parentId = parentId;
+		this.windowStart = wStart;
+		this.windowEnd = this.windowStart + windowLength;
+		this.lastUpdate = wStart;
+		this.windowLength = windowLength;
+		this.windowShift = windowShift;
+		//this.eventsInWindow = new ArrayList<Event>();
+		this.numberEvents = 0;
+		//System.out.println ("Sliding window "+this.id+" expires at "+Tools.formattedDate(this.windowEnd));
+	}
+
+	/**
+	 * @return the id
+	 */
+	public String getId() {
+		return "sw"+id;
+	}
+	
+	public long getWindowStart() {
+		return windowStart;
+	}
+	
+	public void setWindowStart(long start) {
+		this.windowStart = start;
+	}
+	
+	public long getWindowEnd() {
+		return windowEnd;
+	}
+	
+	public void setWindowEnd(long end) {
+		this.windowEnd = end;
+	}
+
+	/**
+	 * @return the windowLength
+	 */
+	public long getWindowLength() {
+		return windowLength;
+	}
+
+	/**
+	 * @param windowLength the windowLength to set
+	 */
+	public void setWindowLength(int windowLength) {
+		this.windowLength = windowLength;
+	}
+
+	/**
+	 * @return the shift
+	 */
+	public long getWindowShift() {
+		return windowShift;
+	}
+
+	/**
+	 * @param shift the shift to set
+	 */
+	public void setShift(int windowShift) {
+		this.windowShift = windowShift;
+	}
+
+	/**
+	 * @return the numberEvents
+	 */
+	public int getNumberEvents() {
+		return numberEvents;
+	}
+	
+	/**
+	 * @param numberEvents the numberEvents to set
+	 */
+	public void setNumberEvents(int numberEvents) {
+		this.numberEvents = numberEvents;
+	}
+	
+/*	*//**
+	 * @return the eventsInWindow
+	 *//*
+	public int getNumberEventsInWindow() {
+		return this.eventsInWindow.size();
+	}
+
+	*//**
+	 * @return the eventsInWindow
+	 *//*
+	public List<Event> getEventsInWindow() {
+		return eventsInWindow;
+	}
+	
+	*//**
+	 * @param eventsInWindow the eventsInWindow to set
+	 *//*
+	public void setEventsInWindow(List<Event> eventsInWindow) {
+		this.eventsInWindow = eventsInWindow;
+	}
+	
+	*//**
+	 * @param additionalEventsInWindow the additional events in window to add
+	 *//*
+	public void addEventsInWindow(List<Event> additionalEventsInWindow) {
+		this.eventsInWindow.addAll(additionalEventsInWindow);
+	}
+	
+	*//**
+	 * @param expiredEventsInWindow the events in window to remove
+	 *//*
+	public void removeEventsInWindow(List<Event> expiredEventsInWindow) {
+		this.eventsInWindow.removeAll(expiredEventsInWindow);
+	}*/
+
+	/**
+	 * @return the parentId
+	 */
+	public String getParentId() {
+		return parentId;
+	}
+
+	/**
+	 * @param parentId the parentId to set
+	 */
+	public void setParentId(String parentId) {
+		this.parentId = parentId;
+	}
+	
+	/**
+	 * Advances the sliding window
+	 */
+	public void advance() {
+		this.windowStart += this.windowShift;
+		this.windowEnd += this.windowShift;
+		//System.out.println ("Sliding window "+this.getId()+" is reset to "+Tools.formattedInterval(this.windowStart, this.windowEnd));
+	}
+
+	/**
+	 * @return the lastUpdate
+	 */
+	public long getLastUpdate() {
+		return lastUpdate;
+	}
+
+	/**
+	 * @param lastUpdate the lastUpdate to set
+	 */
+	public void setLastUpdate(long lastUpdate) {
+		this.lastUpdate = lastUpdate;
+	}
+
+	/**
+	 * @return the state
+	 */
+	public int getState() {
+		return state;
+	}
+
+	/**
+	 * @param state the state to set
+	 */
+	public void setState(int state) {
+		this.state = state;
+	}
+
+	/**
+	 * @return the readyForAction
+	 */
+	public boolean isReadyToEvaluate() {
+		return readyToEvaluate;
+	}
+
+	/**
+	 * @param readyForAction the readyForAction to set
+	 */
+	public void setReadyToEvaluate(boolean readyToEvaluate) {
+		this.readyToEvaluate = readyToEvaluate;
+	}
+	
+	/**
+	 * @return the workingFreezersCount
+	 *//*
+	public int getWorkingFreezersCount() {
+		return workingFreezersCount;
+	}
+
+	*//**
+	 * @param workingFreezersCount the workingFreezersCount to set
+	 *//*
+	public void setWorkingFreezersCount(int workingFreezersCount) {
+		this.workingFreezersCount = workingFreezersCount;
+	}
+
+	*//**
+	 * @return the workingFridgesCount
+	 *//*
+	public int getWorkingFridgesCount() {
+		return workingFridgesCount;
+	}
+
+	*//**
+	 * @param workingFridgesCount the workingFridgesCount to set
+	 *//*
+	public void setWorkingFridgesCount(int workingFridgesCount) {
+		this.workingFridgesCount = workingFridgesCount;
+	}
+
+	public int getDefectiveFridgesCount() {
+		return defectiveFridgesCount;
+	}
+	
+	public void setDefectiveFridgesCount(int defectiveFridgesCount) {
+		this.defectiveFridgesCount = defectiveFridgesCount;
+	}
+
+	public int getDefectiveFreezersCount() {
+		return defectiveFreezersCount;
+	}
+
+	public void setDefectiveFreezersCount(int defectiveFreezersCount) {
+		this.defectiveFreezersCount = defectiveFreezersCount;
+	}
+	
+	public int getWorkingDevicesCount() {
+		return workingFridgesCount+workingFreezersCount;
+	}
+	
+	public int getDefectiveDevicesCount() {
+		return defectiveFridgesCount+defectiveFreezersCount;
+	}
+	
+	public int getOverallFridgesCount() {
+		return getWorkingFridgesCount()+getDefectiveFridgesCount();
+	}
+	
+	public int getOverallFreezersCount() {
+		return getWorkingFreezersCount()+getDefectiveFreezersCount();
+	}
+	
+	public int getOverallDevicesCount() {
+		return getWorkingDevicesCount()+getDefectiveDevicesCount();
+	}
+	
+	public double getWorkingFridgesRatio() {
+		if (getOverallFridgesCount() == 0)
+			return 0;
+		return (double)getWorkingFridgesCount()/getOverallFridgesCount();
+	}
+	
+	public double getDefectiveFridgesRatio() {
+		if (getOverallFridgesCount() == 0)
+			return 0;
+		return (double)getDefectiveFridgesCount()/getOverallFridgesCount();
+	}
+	
+	public double getWorkingFreezersRatio() {
+		if (getOverallFreezersCount() == 0)
+			return 0;
+		return (double)getWorkingFreezersCount()/getOverallFreezersCount();
+	}
+	
+	public double getDefectiveFreezersRatio() {
+		if (getOverallFreezersCount() == 0)
+			return 0;
+		return (double)getDefectiveFreezersCount()/getOverallFreezersCount();
+	}
+	
+	public double getWorkingDevicesRatio() {
+		if (getOverallDevicesCount() == 0)
+			return 0;
+		return (double)getWorkingDevicesCount()/getOverallDevicesCount();
+	}
+	
+	public double getDefectiveDevicesRatio() {
+		if (getOverallDevicesCount() == 0)
+			return 0;
+		return (double)getDefectiveDevicesCount()/getOverallDevicesCount();
+	}*/
+
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,149 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-
-/**
- * @author Matthias Groch
- *
- */
-public class Status {
-	
-	// Status names
-	public static final String[] STATUS_NAMES = {"Operational status"};
-	
-	public static final int OPERATIONAL = 0;
-	
-	////////////////////////////////////////////////////////////////////
-	
-	private int id;
-	private String resourceId;
-	private List<String> valueList;
-	private int currentValue;
-	private long hasValueSince;
-	
-	/**
-	 * @param id The status name.
-	 * @param resourceId The id of the corresponding resource.
-	 */
-	public Status(int id, String resourceId) {
-		this.id = id;
-		this.resourceId = resourceId;
-		this.valueList = new ArrayList<String>();
-		this.hasValueSince = 0;
-	}
-	
-	/**
-	 * @param id The status name.
-	 * @param resourceId The id of the corresponding resource.
-	 * @param currentValue current value of the status.
-	 */
-	public Status(int id, String resourceId, int currentValue) {
-		this (id, resourceId);
-		this.currentValue = currentValue;
-	}
-	
-	/**
-	 * @param id The status name.
-	 * @param resourceId The id of the corresponding resource.
-	 * @param valueList The values this status can have.
-	 * @param currentValue current value of the status.
-	 */
-	public Status(int id, String resourceId, String[] valueList, int currentValue) {
-		this (id, resourceId, currentValue);
-		this.addValues(valueList);
-	}
-
-	/**
-	 * @return the status id
-	 */
-	public int getId() {
-		return this.id;
-	}
-
-	/**
-	 * @param name the status id to set
-	 */
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	/**
-	 * @return the resourceId
-	 */
-	public String getResourceId() {
-		return resourceId;
-	}
-
-	/**
-	 * @param resourceId the resourceId to set
-	 */
-	public void setResourceId(String resourceId) {
-		this.resourceId = resourceId;
-	}
-
-	/**
-	 * @return the currentValue
-	 */
-	public int getCurrentValue() {
-		return currentValue;
-	}
-
-	/**
-	 * @param currentValue the currentValue to set
-	 */
-	public void setCurrentValue(int currentValue, long sinceWhen) {
-		this.currentValue = currentValue;
-		this.hasValueSince = sinceWhen;
-	}
-	
-	/**
-	 * @param oldValue the oldValue to set
-	 * @param newValue the newValue to set
-	 */
-	public void switchCurrentValue(int oldValue, int newValue, long sinceWhen) {
-		if (this.currentValue == oldValue)
-			this.setCurrentValue(newValue, sinceWhen);
-	}
-	
-	/**
-	 * @param oldValue the oldValue to set
-	 * @param newValue the newValue to set
-	 */
-	public void switchCurrentValue(String oldValue, String newValue, long sinceWhen) {
-		this.switchCurrentValue (Integer.parseInt(oldValue), Integer.parseInt(newValue), sinceWhen);
-	}
-	
-	/**
-	 * @param currentValue the currentValue to set
-	 *//*
-	public void setCurrentValue(int currentValue) {
-		setCurrentValue (currentValue, (Calendar)Calendar.getInstance().clone());
-	}*/
-	
-	/**
-	 * @return the valueList
-	 */
-	public String[] getValueList() {
-		return (String[]) valueList.toArray();
-	}
-
-	/**
-	 * @param valueList the valueList to set
-	 */
-	public void addValues(String[] valueList) {
-		this.valueList.addAll(Arrays.asList(valueList));
-	}
-	
-	/**
-	 * @return the hasValueSince
-	 */
-	public long getHasValueSince() {
-		return hasValueSince;
-	}
-	
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Status.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,149 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class Status {
+	
+	// Status names
+	public static final String[] STATUS_NAMES = {"Operational status"};
+	
+	public static final int OPERATIONAL = 0;
+	
+	////////////////////////////////////////////////////////////////////
+	
+	private int id;
+	private String resourceId;
+	private List<String> valueList;
+	private int currentValue;
+	private long hasValueSince;
+	
+	/**
+	 * @param id The status name.
+	 * @param resourceId The id of the corresponding resource.
+	 */
+	public Status(int id, String resourceId) {
+		this.id = id;
+		this.resourceId = resourceId;
+		this.valueList = new ArrayList<String>();
+		this.hasValueSince = 0;
+	}
+	
+	/**
+	 * @param id The status name.
+	 * @param resourceId The id of the corresponding resource.
+	 * @param currentValue current value of the status.
+	 */
+	public Status(int id, String resourceId, int currentValue) {
+		this (id, resourceId);
+		this.currentValue = currentValue;
+	}
+	
+	/**
+	 * @param id The status name.
+	 * @param resourceId The id of the corresponding resource.
+	 * @param valueList The values this status can have.
+	 * @param currentValue current value of the status.
+	 */
+	public Status(int id, String resourceId, String[] valueList, int currentValue) {
+		this (id, resourceId, currentValue);
+		this.addValues(valueList);
+	}
+
+	/**
+	 * @return the status id
+	 */
+	public int getId() {
+		return this.id;
+	}
+
+	/**
+	 * @param name the status id to set
+	 */
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	/**
+	 * @return the resourceId
+	 */
+	public String getResourceId() {
+		return resourceId;
+	}
+
+	/**
+	 * @param resourceId the resourceId to set
+	 */
+	public void setResourceId(String resourceId) {
+		this.resourceId = resourceId;
+	}
+
+	/**
+	 * @return the currentValue
+	 */
+	public int getCurrentValue() {
+		return currentValue;
+	}
+
+	/**
+	 * @param currentValue the currentValue to set
+	 */
+	public void setCurrentValue(int currentValue, long sinceWhen) {
+		this.currentValue = currentValue;
+		this.hasValueSince = sinceWhen;
+	}
+	
+	/**
+	 * @param oldValue the oldValue to set
+	 * @param newValue the newValue to set
+	 */
+	public void switchCurrentValue(int oldValue, int newValue, long sinceWhen) {
+		if (this.currentValue == oldValue)
+			this.setCurrentValue(newValue, sinceWhen);
+	}
+	
+	/**
+	 * @param oldValue the oldValue to set
+	 * @param newValue the newValue to set
+	 */
+	public void switchCurrentValue(String oldValue, String newValue, long sinceWhen) {
+		this.switchCurrentValue (Integer.parseInt(oldValue), Integer.parseInt(newValue), sinceWhen);
+	}
+	
+	/**
+	 * @param currentValue the currentValue to set
+	 *//*
+	public void setCurrentValue(int currentValue) {
+		setCurrentValue (currentValue, (Calendar)Calendar.getInstance().clone());
+	}*/
+	
+	/**
+	 * @return the valueList
+	 */
+	public String[] getValueList() {
+		return (String[]) valueList.toArray();
+	}
+
+	/**
+	 * @param valueList the valueList to set
+	 */
+	public void addValues(String[] valueList) {
+		this.valueList.addAll(Arrays.asList(valueList));
+	}
+	
+	/**
+	 * @return the hasValueSince
+	 */
+	public long getHasValueSince() {
+		return hasValueSince;
+	}
+	
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,78 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.integrationtests.eventgenerator.Event;
-
-/**
- * @author Matthias Groch
- *
- */
-public class StatusChangedEvent extends Event {
-	
-	public static final String[] PROPERTY_FIELD_NAMES = {"OldValue", "NewValue"};
-	
-	public static final int OLD_VALUE = 0;
-	public static final int NEW_VALUE = 1;
-	
-	/**
-	 * Special constructor for a statusChanged event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 */
-	public StatusChangedEvent(String parentId, int oldValue, int newValue) {
-		super(EventType.STATUSCHANGED, parentId);
-		addParameters(createStatusChangedParameters(oldValue, newValue));
-	}
-	
-	/**
-	 * Special constructor for a statusChanged event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 * @param parameters The event parameters.
-	 */
-	public StatusChangedEvent(String parentId, long start, long end) {
-		super(EventType.STATUSCHANGED, parentId, start, end);
-	}
-	
-	/**
-	 * Special constructor for a statusChanged event  
-	 * @param parentId The id of the corresponding site, resource, ...
-	 * @param start The start instance of the event.
-	 * @param end The end instance of the event.
-	 * @param parameters The event parameters.
-	 */
-	public StatusChangedEvent(String parentId, int oldValue, int newValue, long start, long end) {
-		super(EventType.STATUSCHANGED, parentId, start, end);
-		addParameters(createStatusChangedParameters(oldValue, newValue));
-	}
-	
-	private static Map<String, String> createStatusChangedParameters(int oldValue, int newValue){
-		Map<String, String> params = new HashMap<String, String>();
-		params.put(PROPERTY_FIELD_NAMES[OLD_VALUE], String.valueOf(oldValue));
-		params.put(PROPERTY_FIELD_NAMES[NEW_VALUE], String.valueOf(newValue));
-		return params;
-	}
-	
-	/**
-	 * @return value of the oldValue parameter if such a parameter exists, null otherwise
-	 */
-	public String getParamOldValue() {
-		if (this.getParameters().containsKey(PROPERTY_FIELD_NAMES[OLD_VALUE]))
-			return this.getParamValue(PROPERTY_FIELD_NAMES[OLD_VALUE]);
-		return null;
-	}
-	
-	/**
-	 * @return value of the newValue parameter if such a parameter exists, null otherwise
-	 */
-	public String getParamNewValue() {
-		if (this.getParameters().containsKey(PROPERTY_FIELD_NAMES[NEW_VALUE]))
-			return this.getParamValue(PROPERTY_FIELD_NAMES[NEW_VALUE]);
-		return null;
-	}
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/StatusChangedEvent.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,78 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.integrationtests.eventgenerator.Event;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class StatusChangedEvent extends Event {
+	
+	public static final String[] PROPERTY_FIELD_NAMES = {"OldValue", "NewValue"};
+	
+	public static final int OLD_VALUE = 0;
+	public static final int NEW_VALUE = 1;
+	
+	/**
+	 * Special constructor for a statusChanged event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 */
+	public StatusChangedEvent(String parentId, int oldValue, int newValue) {
+		super(EventType.STATUSCHANGED, parentId);
+		addParameters(createStatusChangedParameters(oldValue, newValue));
+	}
+	
+	/**
+	 * Special constructor for a statusChanged event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 * @param parameters The event parameters.
+	 */
+	public StatusChangedEvent(String parentId, long start, long end) {
+		super(EventType.STATUSCHANGED, parentId, start, end);
+	}
+	
+	/**
+	 * Special constructor for a statusChanged event  
+	 * @param parentId The id of the corresponding site, resource, ...
+	 * @param start The start instance of the event.
+	 * @param end The end instance of the event.
+	 * @param parameters The event parameters.
+	 */
+	public StatusChangedEvent(String parentId, int oldValue, int newValue, long start, long end) {
+		super(EventType.STATUSCHANGED, parentId, start, end);
+		addParameters(createStatusChangedParameters(oldValue, newValue));
+	}
+	
+	private static Map<String, String> createStatusChangedParameters(int oldValue, int newValue){
+		Map<String, String> params = new HashMap<String, String>();
+		params.put(PROPERTY_FIELD_NAMES[OLD_VALUE], String.valueOf(oldValue));
+		params.put(PROPERTY_FIELD_NAMES[NEW_VALUE], String.valueOf(newValue));
+		return params;
+	}
+	
+	/**
+	 * @return value of the oldValue parameter if such a parameter exists, null otherwise
+	 */
+	public String getParamOldValue() {
+		if (this.getParameters().containsKey(PROPERTY_FIELD_NAMES[OLD_VALUE]))
+			return this.getParamValue(PROPERTY_FIELD_NAMES[OLD_VALUE]);
+		return null;
+	}
+	
+	/**
+	 * @return value of the newValue parameter if such a parameter exists, null otherwise
+	 */
+	public String getParamNewValue() {
+		if (this.getParameters().containsKey(PROPERTY_FIELD_NAMES[NEW_VALUE]))
+			return this.getParamValue(PROPERTY_FIELD_NAMES[NEW_VALUE]);
+		return null;
+	}
+}

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,41 +0,0 @@
-/**
- * 
- */
-package org.drools.integrationtests.eventgenerator.example;
-
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
-/**
- * @author Matthias Groch
- *
- */
-public class Tools {
-	
-	// Utitlity functions for console output
-	public static String formattedDate (Calendar date){
-		return 
-			((date.get(Calendar.HOUR_OF_DAY) < 10)?  "0" : "") + date.get(Calendar.HOUR_OF_DAY) + ":" +
-			((date.get(Calendar.MINUTE) < 10)?       "0" : "") + date.get(Calendar.MINUTE)      + ":" +
-			((date.get(Calendar.SECOND) < 10)?       "0" : "") + date.get(Calendar.SECOND) + "." +
-			((date.get(Calendar.MILLISECOND) < 10)? "0" : "") + ((date.get(Calendar.MILLISECOND) < 100)? "0" : "") + date.get(Calendar.MILLISECOND);
-	}
-	
-	public static String formattedDate (long dateInMillis){
-		Calendar date = new GregorianCalendar();
-		date.setTimeInMillis(dateInMillis);
-		return formattedDate(date);
-	}
-	
-	public static String formattedInterval(Calendar start, Calendar end){	
-		return "["+Tools.formattedDate(start)+".."+Tools.formattedDate(end)+"]";
-	}
-	
-	public static String formattedInterval(long start, long end){	
-		return "["+Tools.formattedDate(start)+".."+Tools.formattedDate(end)+"]";
-	}
-	
-	public static void drawLine(){
-		System.out.println("----------------------------------------------------------------------------------------------------------------------------------");
-	}
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/example/Tools.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,41 @@
+/**
+ * 
+ */
+package org.drools.integrationtests.eventgenerator.example;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class Tools {
+	
+	// Utitlity functions for console output
+	public static String formattedDate (Calendar date){
+		return 
+			((date.get(Calendar.HOUR_OF_DAY) < 10)?  "0" : "") + date.get(Calendar.HOUR_OF_DAY) + ":" +
+			((date.get(Calendar.MINUTE) < 10)?       "0" : "") + date.get(Calendar.MINUTE)      + ":" +
+			((date.get(Calendar.SECOND) < 10)?       "0" : "") + date.get(Calendar.SECOND) + "." +
+			((date.get(Calendar.MILLISECOND) < 10)? "0" : "") + ((date.get(Calendar.MILLISECOND) < 100)? "0" : "") + date.get(Calendar.MILLISECOND);
+	}
+	
+	public static String formattedDate (long dateInMillis){
+		Calendar date = new GregorianCalendar();
+		date.setTimeInMillis(dateInMillis);
+		return formattedDate(date);
+	}
+	
+	public static String formattedInterval(Calendar start, Calendar end){	
+		return "["+Tools.formattedDate(start)+".."+Tools.formattedDate(end)+"]";
+	}
+	
+	public static String formattedInterval(long start, long end){	
+		return "["+Tools.formattedDate(start)+".."+Tools.formattedDate(end)+"]";
+	}
+	
+	public static void drawLine(){
+		System.out.println("----------------------------------------------------------------------------------------------------------------------------------");
+	}
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -101,8 +101,9 @@
         final DrlParser parser = new DrlParser();
         final PackageDescr pkg = parser.parse( new StringReader( source ) );
         assertFalse( parser.hasErrors() );
-        assertEquals( "foo.bar.baz", pkg.getName() );        
-    }    
+        assertEquals( "foo.bar.baz",
+                      pkg.getName() );
+    }
 
     public void testCompilationUnit() throws Exception {
         final String source = "package foo; import com.foo.Bar; import com.foo.Baz;";
@@ -2579,6 +2580,7 @@
 
         assertEquals( "memberOf",
                       restr.getEvaluator() );
+        assertFalse( restr.isNegated() );
         assertEquals( "$cities",
                       restr.getIdentifier() );
     }
@@ -2603,8 +2605,9 @@
         FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
         VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
 
-        assertEquals( "not memberOf",
+        assertEquals( "memberOf",
                       restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
         assertEquals( "$cities",
                       restr.getIdentifier() );
     }
@@ -3164,8 +3167,9 @@
         FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
         VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
 
-        assertEquals( "not contains",
+        assertEquals( "contains",
                       restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
         assertEquals( "$city",
                       restr.getIdentifier() );
     }
@@ -3188,8 +3192,9 @@
         FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
         LiteralRestrictionDescr restr = (LiteralRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
 
-        assertEquals( "not matches",
+        assertEquals( "matches",
                       restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
         assertEquals( "[abc]*",
                       restr.getText() );
     }
@@ -3391,8 +3396,9 @@
         FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
         QualifiedIdentifierRestrictionDescr restr = (QualifiedIdentifierRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
 
-        assertEquals( "not matches",
+        assertEquals( "matches",
                       restr.getEvaluator() );
+        assertTrue( restr.isNegated() );
         assertEquals( "$c.property",
                       restr.getText() );
     }
@@ -3592,6 +3598,125 @@
         }
     }
 
+    public void testPluggableOperators() throws Exception {
+        final DRLParser parser = parseResource( "pluggable_operators.drl" );
+        parser.compilation_unit();
+
+        assertFalse( "Parser should not have raised errors: " + parser.getErrorMessages().toString(),
+                     parser.hasErrors() );
+
+        final PackageDescr pack = parser.getPackageDescr();
+        assertEquals( 1,
+                      pack.getRules().size() );
+        final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+        assertEquals( 5,
+                      rule.getLhs().getDescrs().size() );
+
+        final PatternDescr eventA = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( "$a",
+                      eventA.getIdentifier() );
+        assertEquals( "EventA",
+                      eventA.getObjectType() );
+
+        final PatternDescr eventB = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+        assertEquals( "$b",
+                      eventB.getIdentifier() );
+        assertEquals( "EventB",
+                      eventB.getObjectType() );
+        assertEquals( 1,
+                      eventB.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdB = (FieldConstraintDescr) eventB.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdB.getRestrictions().size() );
+        assertTrue( fcdB.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rb = (VariableRestrictionDescr) fcdB.getRestrictions().get( 0 );
+        assertEquals( "after",
+                      rb.getEvaluator() );
+        assertEquals( "$a",
+                      rb.getText() );
+        assertEquals( "1,10",
+                      rb.getParameterText() );
+        assertFalse( rb.isNegated() );
+
+        final PatternDescr eventC = (PatternDescr) rule.getLhs().getDescrs().get( 2 );
+        assertEquals( "$c",
+                      eventC.getIdentifier() );
+        assertEquals( "EventC",
+                      eventC.getObjectType() );
+        assertEquals( 1,
+                      eventC.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdC = (FieldConstraintDescr) eventC.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdC.getRestrictions().size() );
+        assertTrue( fcdC.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rc = (VariableRestrictionDescr) fcdC.getRestrictions().get( 0 );
+        assertEquals( "finishes",
+                      rc.getEvaluator() );
+        assertEquals( "$b",
+                      rc.getText() );
+        assertNull( rc.getParameterText() );
+        assertFalse( rc.isNegated() );
+
+        final PatternDescr eventD = (PatternDescr) rule.getLhs().getDescrs().get( 3 );
+        assertEquals( "$d",
+                      eventD.getIdentifier() );
+        assertEquals( "EventD",
+                      eventD.getObjectType() );
+        assertEquals( 1,
+                      eventD.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdD = (FieldConstraintDescr) eventD.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdD.getRestrictions().size() );
+        assertTrue( fcdD.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr rd = (VariableRestrictionDescr) fcdD.getRestrictions().get( 0 );
+        assertEquals( "starts",
+                      rd.getEvaluator() );
+        assertEquals( "$a",
+                      rd.getText() );
+        assertNull( rd.getParameterText() );
+        assertTrue( rd.isNegated() );
+
+        final PatternDescr eventE = (PatternDescr) rule.getLhs().getDescrs().get( 4 );
+        assertEquals( "$e",
+                      eventE.getIdentifier() );
+        assertEquals( "EventE",
+                      eventE.getObjectType() );
+        assertEquals( 1,
+                      eventE.getConstraint().getDescrs().size() );
+        final FieldConstraintDescr fcdE = (FieldConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );
+        assertEquals( 1,
+                      fcdE.getRestrictions().size() );
+        assertTrue( fcdE.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+        final VariableRestrictionDescr re = (VariableRestrictionDescr) fcdE.getRestrictions().get( 0 );
+        assertEquals( "before",
+                      re.getEvaluator() );
+        assertEquals( "$b",
+                      re.getText() );
+        assertEquals( "1, 10",
+                      re.getParameterText() );
+        assertTrue( re.isNegated() );
+    }
+
+    public void testEventImport() throws Exception {
+        final DRLParser parser = parseResource( "import_event.drl" );
+        parser.compilation_unit();
+
+        assertFalse( "Parser should not raise errors: " + parser.getErrorMessages().toString(),
+                     parser.hasErrors() );
+
+        final PackageDescr pack = parser.getPackageDescr();
+
+        final List imports = pack.getImports();
+
+        assertEquals( 1,
+                      imports.size() );
+
+        final ImportDescr descr = (ImportDescr) imports.get( 0 );
+
+        assertTrue( descr.isEvent() );
+
+    }
+
     private DRLParser parse(final String text) throws Exception {
         this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
         return this.parser;

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -14,7 +14,6 @@
 import org.drools.base.ClassObjectType;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.compiler.DialectConfiguration;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.PredicateDescr;
@@ -105,20 +104,21 @@
         final Cheese cheddar = new Cheese( "cheddar",
                                            10 );
         final InternalFactHandle f0 = (InternalFactHandle) wm.insert( cheddar );
+        final InternalFactHandle f1 = (InternalFactHandle) wm.insert( stilton );
         final ReteTuple tuple = new ReteTuple( f0 );
 
         final PredicateContextEntry predicateContext = new PredicateContextEntry();
         predicateContext.leftTuple = tuple;
 
         assertTrue( predicate.isAllowedCachedLeft( predicateContext,
-                                                   stilton ) );
+                                                   f1 ) );
 
         cheddar.setPrice( 9 );
         wm.update( f0,
                    cheddar );
 
         assertFalse( predicate.isAllowedCachedLeft( predicateContext,
-                                                    stilton ) );
+                                                    f1 ) );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,7 +16,6 @@
 import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.compiler.DialectConfiguration;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.ReturnValueRestrictionDescr;
@@ -29,7 +28,7 @@
 import org.drools.spi.FieldExtractor;
 
 public class MVELReturnValueBuilderTest extends TestCase {
-    
+
     private ClassFieldExtractorCache cache;
 
     public void setUp() {
@@ -42,18 +41,19 @@
 
         PackageBuilder pkgBuilder = new PackageBuilder( pkg );
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
-        MVELDialect mvelDialect = ( MVELDialect ) pkgBuilder.getDialectRegistry().getDialect( "mvel" );
+        MVELDialect mvelDialect = (MVELDialect) pkgBuilder.getDialectRegistry().getDialect( "mvel" );
 
         final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
                                                                                pkg,
                                                                                ruleDescr,
                                                                                pkgBuilder.getDialectRegistry(),
                                                                                mvelDialect );
-        
+
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class, "price",
-                                                                                getClass().getClassLoader() );
-        
+        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+                                                             "price",
+                                                             getClass().getClassLoader() );
+
         final Pattern patternA = new Pattern( 0,
                                               new ClassObjectType( int.class ) );
 
@@ -92,7 +92,8 @@
                                                                                previousDeclarations,
                                                                                localDeclarations,
                                                                                requiredGlobals,
-                                                                               ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL ) );
+                                                                               context.getConfiguration().getEvaluatorRegistry().getEvaluator( ValueType.PINTEGER_TYPE,
+                                                                                                                                               Operator.EQUAL ) );
 
         builder.build( context,
                        usedIdentifiers,
@@ -118,14 +119,17 @@
 
         final Cheese brie = new Cheese( "brie",
                                         20 );
+        final InternalFactHandle f2 = (InternalFactHandle) wm.insert( brie );
+
         assertTrue( returnValue.isAllowed( extractor,
-                                           brie,
+                                           f2,
                                            tuple,
                                            wm ) );
 
         brie.setPrice( 18 );
+        wm.update( f2, brie );
         assertFalse( returnValue.isAllowed( extractor,
-                                            brie,
+                                            f2,
                                             tuple,
                                             wm ) );
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -4,9 +4,11 @@
 import java.io.InputStream;
 import java.util.List;
 
+import org.drools.ClockType;
 import org.drools.RuleBase;
 import org.drools.StatefulSession;
 import org.drools.StatelessSession;
+import org.drools.TemporalSession;
 import org.drools.event.RuleBaseEventListener;
 import org.drools.rule.Package;
 
@@ -114,4 +116,15 @@
 
 	}
 
+    public TemporalSession newTemporalSession(ClockType clockType) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public TemporalSession newTemporalSession(boolean keepReference,
+                                              ClockType clockType) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -27,6 +27,7 @@
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
 import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.ObjectTypeConf;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
 import org.drools.ruleflow.common.instance.ProcessInstance;
@@ -413,4 +414,14 @@
         return null;
     }
 
+    public ObjectTypeConf getObjectTypeConf(Object object) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Map<Object, ObjectTypeConf> getObjectTypeConfMap() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -27,648 +27,882 @@
 
 public class ScenarioRunnerTest extends RuleUnit {
 
-	public void testPopulateFacts() throws Exception {
-		Scenario sc = new Scenario();
-		List facts = ls(
-				new FactData("Cheese", "c1", ls(
-						new FieldData("type", "cheddar"),
-						new FieldData("price", "42") ),  false),
-				new FactData("Person", "p1", ls(
-						new FieldData("name", "mic"),
-						new FieldData("age", "=30 + 3") ), false) );
+    public void testPopulateFacts() throws Exception {
+        Scenario sc = new Scenario();
+        List facts = ls( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "type",
+                                                          "cheddar" ),
+                                           new FieldData( "price",
+                                                          "42" ) ),
+                                       false ),
+                         new FactData( "Person",
+                                       "p1",
+                                       ls( new FieldData( "name",
+                                                          "mic" ),
+                                           new FieldData( "age",
+                                                          "=30 + 3" ) ),
+                                       false ) );
 
-		sc.fixtures.addAll(facts);
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
-		resolver.addImport("org.drools.Person");
-		ScenarioRunner runner = new ScenarioRunner(sc, resolver,
-				new MockWorkingMemory());
+        sc.fixtures.addAll( facts );
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.Person" );
+        ScenarioRunner runner = new ScenarioRunner( sc,
+                                                    resolver,
+                                                    new MockWorkingMemory() );
 
-		assertTrue(runner.populatedData.containsKey("c1"));
-		assertTrue(runner.populatedData.containsKey("p1"));
+        assertTrue( runner.populatedData.containsKey( "c1" ) );
+        assertTrue( runner.populatedData.containsKey( "p1" ) );
 
-		Cheese c = (Cheese) runner.populatedData.get("c1");
-		assertEquals("cheddar", c.getType());
-		assertEquals(42, c.getPrice());
+        Cheese c = (Cheese) runner.populatedData.get( "c1" );
+        assertEquals( "cheddar",
+                      c.getType() );
+        assertEquals( 42,
+                      c.getPrice() );
 
-		Person p = (Person) runner.populatedData.get("p1");
-		assertEquals("mic", p.getName());
-		assertEquals(33, p.getAge());
+        Person p = (Person) runner.populatedData.get( "p1" );
+        assertEquals( "mic",
+                      p.getName() );
+        assertEquals( 33,
+                      p.getAge() );
 
-	}
+    }
 
-	public void testPopulateFactsWithExpressions() throws Exception {
-		Scenario sc = new Scenario();
-		List facts = ls(
-				new FactData("Cheese", "c1", ls(
-						new FieldData("type", "cheddar"),
-						new FieldData("price", "42") ),  false),
-				new FactData("Cheese", "c2", ls(
-						new FieldData("type", "= c1.type")), false) );
+    public void testPopulateFactsWithExpressions() throws Exception {
+        Scenario sc = new Scenario();
+        List facts = ls( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "type",
+                                                          "cheddar" ),
+                                           new FieldData( "price",
+                                                          "42" ) ),
+                                       false ),
+                         new FactData( "Cheese",
+                                       "c2",
+                                       ls( new FieldData( "type",
+                                                          "= c1.type" ) ),
+                                       false ) );
 
-		sc.fixtures.addAll(facts);
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+        sc.fixtures.addAll( facts );
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
-		ScenarioRunner runner = new ScenarioRunner(sc, resolver,
-				new MockWorkingMemory());
+        ScenarioRunner runner = new ScenarioRunner( sc,
+                                                    resolver,
+                                                    new MockWorkingMemory() );
 
-		assertTrue(runner.populatedData.containsKey("c1"));
-		assertTrue(runner.populatedData.containsKey("c2"));
+        assertTrue( runner.populatedData.containsKey( "c1" ) );
+        assertTrue( runner.populatedData.containsKey( "c2" ) );
 
-		Cheese c = (Cheese) runner.populatedData.get("c1");
-		assertEquals("cheddar", c.getType());
-		assertEquals(42, c.getPrice());
+        Cheese c = (Cheese) runner.populatedData.get( "c1" );
+        assertEquals( "cheddar",
+                      c.getType() );
+        assertEquals( 42,
+                      c.getPrice() );
 
-		Cheese c2 = (Cheese) runner.populatedData.get("c2");
-		assertEquals(c.getType(), c2.getType());
+        Cheese c2 = (Cheese) runner.populatedData.get( "c2" );
+        assertEquals( c.getType(),
+                      c2.getType() );
 
-	}
+    }
 
+    public void testPopulateNoData() throws Exception {
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        ScenarioRunner run = new ScenarioRunner( new Scenario(),
+                                                 resolver,
+                                                 new MockWorkingMemory() );
+        run.populatedData.clear();
+        Cheese c = new Cheese();
+        c.setType( "whee" );
+        c.setPrice( 1 );
+        run.populatedData.put( "x",
+                               c );
 
-	public void testPopulateNoData() throws Exception {
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
-		ScenarioRunner run = new ScenarioRunner(new Scenario(), resolver, new MockWorkingMemory());
-		run.populatedData.clear();
-		Cheese c = new Cheese();
-		c.setType("whee");
-		c.setPrice(1);
-		run.populatedData.put("x", c);
+        assertEquals( 1,
+                      c.getPrice() );
 
-		assertEquals(1, c.getPrice());
+        FactData fd = new FactData( "Cheese",
+                                    "x",
+                                    ls( new FieldData( "type",
+                                                       "" ),
+                                        new FieldData( "price",
+                                                       "42" ) ),
+                                    false );
 
-		FactData fd = new FactData("Cheese", "x", ls(new FieldData("type", ""), new FieldData("price", "42")), false);
+        run.populateFields( fd,
+                            run.populatedData,
+                            c );
+        assertEquals( "whee",
+                      c.getType() );
+        assertEquals( 42,
+                      c.getPrice() );
+    }
 
-		run.populateFields(fd, run.populatedData, c);
-		assertEquals("whee", c.getType());
-		assertEquals(42, c.getPrice());
-	}
+    public void testVerifyFacts() throws Exception {
 
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese( "cheddar",
+                                42 );
+        runner.populatedData.put( "f1",
+                                  f1 );
 
+        Person f2 = new Person( "michael",
+                                33 );
+        runner.populatedData.put( "f2",
+                                  f2 );
 
-	public void testVerifyFacts() throws Exception {
+        // test all true
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues = ls( new VerifyField( "type",
+                                              "cheddar",
+                                              "==" ),
+                             new VerifyField( "price",
+                                              "42",
+                                              "==" ) );
 
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		Cheese f1 = new Cheese("cheddar", 42);
-		runner.populatedData.put("f1", f1);
+        runner.verify( vf );
+        for ( int i = 0; i < vf.fieldValues.size(); i++ ) {
+            assertTrue( ((VerifyField) vf.fieldValues.get( i )).successResult );
+        }
 
-		Person f2 = new Person("michael", 33);
-		runner.populatedData.put("f2", f2);
+        vf = new VerifyFact();
+        vf.name = "f2";
+        vf.fieldValues = ls( new VerifyField( "name",
+                                              "michael",
+                                              "==" ),
+                             new VerifyField( "age",
+                                              "33",
+                                              "==" ) );
 
-		// test all true
-		VerifyFact vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues = ls(
-				new VerifyField("type", "cheddar", "=="),
-				new VerifyField("price", "42", "==") );
+        runner.verify( vf );
+        for ( int i = 0; i < vf.fieldValues.size(); i++ ) {
+            assertTrue( ((VerifyField) vf.fieldValues.get( i )).successResult );
+        }
 
-		runner.verify(vf);
-		for (int i = 0; i < vf.fieldValues.size(); i++) {
-			assertTrue(( (VerifyField)vf.fieldValues.get(i)).successResult);
-		}
+        // test one false
+        vf = new VerifyFact();
+        vf.name = "f2";
+        vf.fieldValues = ls( new VerifyField( "name",
+                                              "mark",
+                                              "==" ),
+                             new VerifyField( "age",
+                                              "33",
+                                              "==" ) );
 
-		vf = new VerifyFact();
-		vf.name = "f2";
-		vf.fieldValues = ls(
-				new VerifyField("name", "michael", "=="),
-				new VerifyField("age", "33", "==") );
+        runner.verify( vf );
+        assertFalse( ((VerifyField) vf.fieldValues.get( 0 )).successResult );
+        assertTrue( ((VerifyField) vf.fieldValues.get( 1 )).successResult );
 
-		runner.verify(vf);
-		for (int i = 0; i < vf.fieldValues.size(); i++) {
-			assertTrue(((VerifyField)vf.fieldValues.get(i)).successResult);
-		}
+        assertEquals( "michael",
+                      ((VerifyField) vf.fieldValues.get( 0 )).actualResult );
+        assertEquals( "mark",
+                      ((VerifyField) vf.fieldValues.get( 0 )).expected );
 
-		// test one false
-		vf = new VerifyFact();
-		vf.name = "f2";
-		vf.fieldValues = ls(new VerifyField("name", "mark", "=="),
-				new VerifyField("age", "33", "==") );
+        // test 2 false
+        vf = new VerifyFact();
+        vf.name = "f2";
+        vf.fieldValues = ls( new VerifyField( "name",
+                                              "mark",
+                                              "==" ),
+                             new VerifyField( "age",
+                                              "32",
+                                              "==" ) );
 
-		runner.verify(vf);
-		assertFalse(((VerifyField)vf.fieldValues.get(0)).successResult);
-		assertTrue(( (VerifyField)vf.fieldValues.get(1)).successResult);
+        runner.verify( vf );
+        assertFalse( ((VerifyField) vf.fieldValues.get( 0 )).successResult );
+        assertFalse( ((VerifyField) vf.fieldValues.get( 1 )).successResult );
 
-		assertEquals("michael", ((VerifyField)vf.fieldValues.get(0)).actualResult);
-		assertEquals("mark", ((VerifyField)vf.fieldValues.get(0)).expected);
+        assertEquals( "michael",
+                      ((VerifyField) vf.fieldValues.get( 0 )).actualResult );
+        assertEquals( "mark",
+                      ((VerifyField) vf.fieldValues.get( 0 )).expected );
 
-		// test 2 false
-		vf = new VerifyFact();
-		vf.name = "f2";
-		vf.fieldValues = ls( new VerifyField("name", "mark", "=="),
-				new VerifyField("age", "32", "==") );
+        assertEquals( "33",
+                      ((VerifyField) vf.fieldValues.get( 1 )).actualResult );
+        assertEquals( "32",
+                      ((VerifyField) vf.fieldValues.get( 1 )).expected );
 
-		runner.verify(vf);
-		assertFalse(((VerifyField)vf.fieldValues.get(0)).successResult);
-		assertFalse(((VerifyField)vf.fieldValues.get(1)).successResult);
+    }
 
-		assertEquals("michael", ((VerifyField)vf.fieldValues.get(0)).actualResult);
-		assertEquals("mark", ((VerifyField)vf.fieldValues.get(0)).expected);
+    public void testVerifyFactsWithOperator() throws Exception {
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese( "cheddar",
+                                42 );
+        runner.populatedData.put( "f1",
+                                  f1 );
 
-		assertEquals("33", ((VerifyField)vf.fieldValues.get(1)).actualResult);
-		assertEquals("32", ((VerifyField)vf.fieldValues.get(1)).expected);
+        // test all true
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues = ls( new VerifyField( "type",
+                                              "cheddar",
+                                              "==" ),
+                             new VerifyField( "price",
+                                              "4777",
+                                              "!=" ) );
+        runner.verify( vf );
+        for ( int i = 0; i < vf.fieldValues.size(); i++ ) {
+            assertTrue( ((VerifyField) vf.fieldValues.get( i )).successResult );
+        }
 
-	}
+        vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues = ls( new VerifyField( "type",
+                                              "cheddar",
+                                              "!=" ) );
+        runner.verify( vf );
+        assertFalse( ((VerifyField) vf.fieldValues.get( 0 )).successResult );
 
-	public void testVerifyFactsWithOperator() throws Exception {
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		Cheese f1 = new Cheese("cheddar", 42);
-		runner.populatedData.put("f1", f1);
+    }
 
-		// test all true
-		VerifyFact vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues = ls(
-				new VerifyField("type", "cheddar", "=="),
-				new VerifyField("price", "4777", "!=") );
-		runner.verify(vf);
-		for (int i = 0; i < vf.fieldValues.size(); i++) {
-			assertTrue(((VerifyField)vf.fieldValues.get(i)).successResult);
-		}
+    public void testVerifyFactsWithExpression() throws Exception {
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese( "cheddar",
+                                42 );
+        runner.populatedData.put( "f1",
+                                  f1 );
+        f1.setPrice( 42 );
+        // test all true
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues = ls( new VerifyField( "price",
+                                              "= 40 + 2",
+                                              "==" ) );
+        runner.verify( vf );
 
-		vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues = ls(
-				new VerifyField("type", "cheddar", "!="));
-		runner.verify(vf);
-		assertFalse(((VerifyField)vf.fieldValues.get(0)).successResult);
+        assertTrue( ((VerifyField) vf.fieldValues.get( 0 )).successResult );
+    }
 
-	}
+    public void testVerifyFactExplanation() throws Exception {
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese();
+        f1.setType( null );
+        runner.populatedData.put( "f1",
+                                  f1 );
 
-	public void testVerifyFactsWithExpression() throws Exception {
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		Cheese f1 = new Cheese("cheddar", 42);
-		runner.populatedData.put("f1", f1);
-		f1.setPrice(42);
-		// test all true
-		VerifyFact vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues = ls(
-				new VerifyField("price", "= 40 + 2", "==") );
-		runner.verify(vf);
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues.add( new VerifyField( "type",
+                                             "boo",
+                                             "!=" ) );
 
-		assertTrue(((VerifyField)vf.fieldValues.get(0)).successResult);
-	}
+        runner.verify( vf );
+        VerifyField vfl = (VerifyField) vf.fieldValues.get( 0 );
+        assertEquals( "[f1] field [type] was not [boo].",
+                      vfl.explanation );
 
-	public void testVerifyFactExplanation() throws Exception {
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		Cheese f1 = new Cheese();
-		f1.setType(null);
-		runner.populatedData.put("f1", f1);
+    }
 
-		VerifyFact vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues.add(new VerifyField("type", "boo", "!="));
+    public void testVerifyFieldAndActualIsNull() throws Exception {
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese();
+        f1.setType( null );
+        runner.populatedData.put( "f1",
+                                  f1 );
 
-		runner.verify(vf);
-		VerifyField vfl = (VerifyField) vf.fieldValues.get(0);
-		assertEquals("[f1] field [type] was not [boo].", vfl.explanation);
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        vf.fieldValues.add( new VerifyField( "type",
+                                             "boo",
+                                             "==" ) );
 
+        runner.verify( vf );
+        VerifyField vfl = (VerifyField) vf.fieldValues.get( 0 );
 
-	}
+        assertEquals( "[f1] field [type] was [] expected [boo].",
+                      vfl.explanation );
+        assertEquals( "boo",
+                      vfl.expected );
+        assertEquals( "",
+                      vfl.actualResult );
 
-	public void testVerifyFieldAndActualIsNull() throws Exception {
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		Cheese f1 = new Cheese();
-		f1.setType(null);
-		runner.populatedData.put("f1", f1);
+    }
 
-		VerifyFact vf = new VerifyFact();
-		vf.name = "f1";
-		vf.fieldValues.add(new VerifyField("type", "boo", "=="));
+    public void testDummyRunNoRules() throws Exception {
+        Scenario sc = new Scenario();
+        FactData[] facts = new FactData[]{new FactData( "Cheese",
+                                                        "c1",
+                                                        ls( new FieldData( "type",
+                                                                           "cheddar" ),
+                                                            new FieldData( "price",
+                                                                           "42" ) ),
+                                                        false )};
 
-		runner.verify(vf);
-		VerifyField vfl = (VerifyField) vf.fieldValues.get(0);
+        VerifyFact[] assertions = new VerifyFact[]{new VerifyFact( "c1",
+                                                                   ls( new VerifyField( "type",
+                                                                                        "cheddar",
+                                                                                        "==" ),
+                                                                       new VerifyField( "price",
+                                                                                        "42",
+                                                                                        "==" ) ) )};
 
-		assertEquals("[f1] field [type] was [] expected [boo].", vfl.explanation);
-		assertEquals("boo", vfl.expected);
-		assertEquals("", vfl.actualResult);
+        sc.fixtures.addAll( Arrays.asList( facts ) );
+        sc.fixtures.addAll( Arrays.asList( assertions ) );
 
-	}
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
-	public void testDummyRunNoRules() throws Exception {
-		Scenario sc = new Scenario();
-		FactData[] facts = new FactData[] { new FactData("Cheese", "c1",
-				ls( new FieldData("type", "cheddar"),
-						new FieldData("price", "42") ), false) };
+        MockWorkingMemory wm = new MockWorkingMemory();
+        ScenarioRunner runner = new ScenarioRunner( sc,
+                                                    resolver,
+                                                    wm );
+        assertEquals( 1,
+                      wm.facts.size() );
+        assertEquals( runner.populatedData.get( "c1" ),
+                      wm.facts.get( 0 ) );
 
-		VerifyFact[] assertions = new VerifyFact[] { new VerifyFact("c1",
-				ls( new VerifyField("type", "cheddar", "=="),
-						new VerifyField("price", "42", "==") )) };
+        assertTrue( runner.populatedData.containsKey( "c1" ) );
+        VerifyFact vf = (VerifyFact) assertions[0];
+        for ( int i = 0; i < vf.fieldValues.size(); i++ ) {
+            assertTrue( ((VerifyField) vf.fieldValues.get( i )).successResult );
+        }
 
-		sc.fixtures.addAll(Arrays.asList(facts));
-		sc.fixtures.addAll(Arrays.asList(assertions));
+    }
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+    public void testCountVerification() throws Exception {
 
-		MockWorkingMemory wm = new MockWorkingMemory();
-		ScenarioRunner runner = new ScenarioRunner(sc, resolver, wm);
-		assertEquals(1, wm.facts.size());
-		assertEquals(runner.populatedData.get("c1"), wm.facts.get(0));
+        Map<String, Integer> firingCounts = new HashMap<String, Integer>();
+        firingCounts.put( "foo",
+                          2 );
+        firingCounts.put( "bar",
+                          1 );
+        // and baz, we leave out
 
-		assertTrue(runner.populatedData.containsKey("c1"));
-		VerifyFact vf = (VerifyFact) assertions[0];
-		for (int i = 0; i < vf.fieldValues.size(); i++) {
-			assertTrue(((VerifyField)vf.fieldValues.get(i)).successResult);
-		}
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        VerifyRuleFired v = new VerifyRuleFired();
+        v.ruleName = "foo";
+        v.expectedFire = true;
+        runner.verify( v,
+                       firingCounts );
+        assertTrue( v.successResult );
+        assertEquals( 2,
+                      v.actualResult.intValue() );
 
-	}
+        v = new VerifyRuleFired();
+        v.ruleName = "foo";
+        v.expectedFire = false;
+        runner.verify( v,
+                       firingCounts );
+        assertFalse( v.successResult );
+        assertEquals( 2,
+                      v.actualResult.intValue() );
+        assertNotNull( v.explanation );
 
-	public void testCountVerification() throws Exception {
+        v = new VerifyRuleFired();
+        v.ruleName = "foo";
+        v.expectedCount = 2;
 
-		Map<String, Integer> firingCounts = new HashMap<String, Integer>();
-		firingCounts.put("foo", 2);
-		firingCounts.put("bar", 1);
-		// and baz, we leave out
+        runner.verify( v,
+                       firingCounts );
+        assertTrue( v.successResult );
+        assertEquals( 2,
+                      v.actualResult.intValue() );
 
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
-		VerifyRuleFired v = new VerifyRuleFired();
-		v.ruleName = "foo";
-		v.expectedFire = true;
-		runner.verify(v, firingCounts);
-		assertTrue(v.successResult);
-		assertEquals(2, v.actualResult.intValue());
+    }
 
-		v = new VerifyRuleFired();
-		v.ruleName = "foo";
-		v.expectedFire = false;
-		runner.verify(v, firingCounts);
-		assertFalse(v.successResult);
-		assertEquals(2, v.actualResult.intValue());
-		assertNotNull(v.explanation);
+    public void testTestingEventListener() throws Exception {
+        Scenario sc = new Scenario();
+        sc.rules.add( "foo" );
+        sc.rules.add( "bar" );
+        ExecutionTrace ext = new ExecutionTrace();
 
-		v = new VerifyRuleFired();
-		v.ruleName = "foo";
-		v.expectedCount = 2;
+        sc.fixtures.add( ext );
 
-		runner.verify(v, firingCounts);
-		assertTrue(v.successResult);
-		assertEquals(2, v.actualResult.intValue());
+        MockWorkingMemory wm = new MockWorkingMemory();
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 null,
+                                                 wm );
+        assertEquals( wm,
+                      run.workingMemory );
+        assertNotNull( wm.agendaEventListener );
+        assertTrue( wm.agendaEventListener instanceof TestingEventListener );
+        TestingEventListener lnr = (TestingEventListener) wm.agendaEventListener;
+        assertEquals( 2,
+                      sc.rules.size() );
+        assertTrue( sc.rules.contains( "foo" ) );
+        assertTrue( sc.rules.contains( "bar" ) );
+    }
 
-	}
+    public void testWithGlobals() throws Exception {
+        Scenario sc = new Scenario();
+        FactData[] facts = new FactData[]{new FactData( "Cheese",
+                                                        "c2",
+                                                        ls( new FieldData( "type",
+                                                                           "stilton" ) ),
+                                                        false )};
+        sc.globals.add( new FactData( "Cheese",
+                                      "c",
+                                      ls( new FieldData( "type",
+                                                         "cheddar" ) ),
+                                      false ) );
+        sc.fixtures.addAll( Arrays.asList( facts ) );
 
-	public void testTestingEventListener() throws Exception {
-		Scenario sc = new Scenario();
-		sc.rules.add("foo"); sc.rules.add("bar");
-		ExecutionTrace ext = new ExecutionTrace();
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
+        MockWorkingMemory wm = new MockWorkingMemory();
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 wm );
+        assertEquals( 1,
+                      wm.globals.size() );
+        assertEquals( 1,
+                      run.globalData.size() );
+        assertEquals( 1,
+                      run.populatedData.size() );
+        assertEquals( 1,
+                      wm.facts.size() );
 
+        Cheese c = (Cheese) wm.globals.get( "c" );
+        assertEquals( "cheddar",
+                      c.getType() );
+        Cheese c2 = (Cheese) wm.facts.get( 0 );
+        assertEquals( "stilton",
+                      c2.getType() );
 
+    }
 
-		sc.fixtures.add(ext);
+    @SuppressWarnings("deprecation")
+    // F**** dates in java. What a mess. Someone should die.
+    public void testSimulatedDate() throws Exception {
+        Scenario sc = new Scenario();
+        MockWorkingMemory wm = new MockWorkingMemory();
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 null,
+                                                 wm );
+        TimeMachine tm = run.workingMemory.getTimeMachine();
 
-		MockWorkingMemory wm = new MockWorkingMemory();
-		ScenarioRunner run = new ScenarioRunner(sc, null, wm);
-		assertEquals(wm, run.workingMemory);
-		assertNotNull(wm.agendaEventListener);
-		assertTrue(wm.agendaEventListener instanceof TestingEventListener);
-		TestingEventListener lnr = (TestingEventListener) wm.agendaEventListener;
-		assertEquals(2, sc.rules.size());
-		assertTrue(sc.rules.contains("foo"));
-		assertTrue(sc.rules.contains("bar"));
-	}
+        // love you
+        long time = tm.getNow().getTimeInMillis();
 
-	public void testWithGlobals() throws Exception {
-		Scenario sc = new Scenario();
-		FactData[] facts = new FactData[] {
-				new FactData("Cheese", "c2", ls( new FieldData(
-						"type", "stilton") ), false) };
-		sc.globals.add(new FactData("Cheese", "c", ls( new FieldData(
-				"type", "cheddar") ), false));
-		sc.fixtures.addAll(Arrays.asList(facts));
+        Thread.sleep( 100 );
+        long future = tm.getNow().getTimeInMillis();
+        assertTrue( future > time );
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+        ExecutionTrace ext = new ExecutionTrace();
+        ext.scenarioSimulatedDate = new Date( "10-Jul-1974" );
+        sc.fixtures.add( ext );
+        run = new ScenarioRunner( sc,
+                                  null,
+                                  wm );
+        tm = run.workingMemory.getTimeMachine();
 
-		MockWorkingMemory wm = new MockWorkingMemory();
-		ScenarioRunner run = new ScenarioRunner(sc, resolver, wm);
-		assertEquals(1, wm.globals.size());
-		assertEquals(1, run.globalData.size());
-		assertEquals(1, run.populatedData.size());
-		assertEquals(1, wm.facts.size());
+        long expected = ext.scenarioSimulatedDate.getTime();
+        assertEquals( expected,
+                      tm.getNow().getTimeInMillis() );
+        Thread.sleep( 50 );
+        assertEquals( expected,
+                      tm.getNow().getTimeInMillis() );
 
-		Cheese c = (Cheese) wm.globals.get("c");
-		assertEquals("cheddar", c.getType());
-		Cheese c2 = (Cheese) wm.facts.get(0);
-		assertEquals("stilton", c2.getType());
+    }
 
-	}
+    public void testVerifyRuleFired() throws Exception {
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
 
-	@SuppressWarnings("deprecation")
-	// F**** dates in java. What a mess. Someone should die.
-	public void testSimulatedDate() throws Exception {
-		Scenario sc = new Scenario();
-		MockWorkingMemory wm = new MockWorkingMemory();
-		ScenarioRunner run = new ScenarioRunner(sc, null, wm);
-		TimeMachine tm = run.workingMemory.getTimeMachine();
+        VerifyRuleFired vr = new VerifyRuleFired( "qqq",
+                                                  42,
+                                                  null );
+        Map<String, Integer> f = new HashMap<String, Integer>();
+        f.put( "qqq",
+               42 );
+        f.put( "qaz",
+               1 );
 
-		// love you
-		long time = tm.getNow().getTimeInMillis();
+        runner.verify( vr,
+                       f );
+        assertTrue( vr.wasSuccessful() );
+        assertEquals( 42,
+                      vr.actualResult.intValue() );
 
-		Thread.sleep(100);
-		long future = tm.getNow().getTimeInMillis();
-		assertTrue(future > time);
+        vr = new VerifyRuleFired( "qqq",
+                                  41,
+                                  null );
+        runner.verify( vr,
+                       f );
+        assertFalse( vr.wasSuccessful() );
+        assertEquals( 42,
+                      vr.actualResult.intValue() );
 
-		ExecutionTrace ext = new ExecutionTrace();
-		ext.scenarioSimulatedDate = new Date("10-Jul-1974");
-		sc.fixtures.add(ext);
-		run = new ScenarioRunner(sc, null, wm);
-		tm = run.workingMemory.getTimeMachine();
+        vr = new VerifyRuleFired( "qaz",
+                                  1,
+                                  null );
+        runner.verify( vr,
+                       f );
+        assertTrue( vr.wasSuccessful() );
+        assertEquals( 1,
+                      vr.actualResult.intValue() );
 
-		long expected = ext.scenarioSimulatedDate.getTime();
-		assertEquals(expected, tm.getNow().getTimeInMillis());
-		Thread.sleep(50);
-		assertEquals(expected, tm.getNow().getTimeInMillis());
+        vr = new VerifyRuleFired( "XXX",
+                                  null,
+                                  false );
+        runner.verify( vr,
+                       f );
+        assertTrue( vr.wasSuccessful() );
+        assertEquals( 0,
+                      vr.actualResult.intValue() );
 
-	}
+        vr = new VerifyRuleFired( "qqq",
+                                  null,
+                                  true );
+        runner.verify( vr,
+                       f );
+        assertTrue( vr.wasSuccessful() );
+        assertEquals( 42,
+                      vr.actualResult.intValue() );
 
-	public void testVerifyRuleFired() throws Exception {
-		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
-				new MockWorkingMemory());
+        vr = new VerifyRuleFired( "qqq",
+                                  null,
+                                  false );
+        runner.verify( vr,
+                       f );
+        assertFalse( vr.wasSuccessful() );
+        assertEquals( 42,
+                      vr.actualResult.intValue() );
 
-		VerifyRuleFired vr = new VerifyRuleFired("qqq", 42, null);
-		Map<String, Integer> f = new HashMap<String, Integer>();
-		f.put("qqq", 42);
-		f.put("qaz", 1);
+    }
 
-		runner.verify(vr, f);
-		assertTrue(vr.wasSuccessful());
-		assertEquals(42, vr.actualResult.intValue());
+    /**
+     * Do a kind of end to end test with some real rules.
+     */
+    public void testIntegrationWithSuccess() throws Exception {
 
-		vr = new VerifyRuleFired("qqq", 41, null);
-		runner.verify(vr, f);
-		assertFalse(vr.wasSuccessful());
-		assertEquals(42, vr.actualResult.intValue());
+        Scenario sc = new Scenario();
+        FactData[] facts = new FactData[]{new FactData( "Cheese",
+                                                        "c1",
+                                                        ls( new FieldData( "type",
+                                                                           "cheddar" ),
+                                                            new FieldData( "price",
+                                                                           "42" ) ),
+                                                        false )
 
-		vr = new VerifyRuleFired("qaz", 1, null);
-		runner.verify(vr, f);
-		assertTrue(vr.wasSuccessful());
-		assertEquals(1, vr.actualResult.intValue());
+        };
+        sc.globals.add( new FactData( "Person",
+                                      "p",
+                                      new ArrayList(),
+                                      false ) );
+        sc.fixtures.addAll( Arrays.asList( facts ) );
 
-		vr = new VerifyRuleFired("XXX", null, false);
-		runner.verify(vr, f);
-		assertTrue(vr.wasSuccessful());
-		assertEquals(0, vr.actualResult.intValue());
+        ExecutionTrace executionTrace = new ExecutionTrace();
 
-		vr = new VerifyRuleFired("qqq", null, true);
-		runner.verify(vr, f);
-		assertTrue(vr.wasSuccessful());
-		assertEquals(42, vr.actualResult.intValue());
+        sc.rules.add( "rule1" );
+        sc.rules.add( "rule2" );
+        sc.inclusive = true;
+        sc.fixtures.add( executionTrace );
 
-		vr = new VerifyRuleFired("qqq", null, false);
-		runner.verify(vr, f);
-		assertFalse(vr.wasSuccessful());
-		assertEquals(42, vr.actualResult.intValue());
+        Expectation[] assertions = new Expectation[5];
 
+        assertions[0] = new VerifyFact( "c1",
+                                        ls( new VerifyField( "type",
+                                                             "cheddar",
+                                                             "==" )
 
-	}
+                                        ) );
 
-	/**
-	 * Do a kind of end to end test with some real rules.
-	 */
-	public void testIntegrationWithSuccess() throws Exception {
+        assertions[1] = new VerifyFact( "p",
+                                        ls( new VerifyField( "name",
+                                                             "rule1",
+                                                             "==" ),
+                                            new VerifyField( "status",
+                                                             "rule2",
+                                                             "==" ) )
 
-		Scenario sc = new Scenario();
-		FactData[] facts = new FactData[] {
-				new FactData("Cheese", "c1", ls(
-						new FieldData("type", "cheddar"),
-						new FieldData("price", "42") ),  false)
+        );
 
-				};
-		sc.globals.add(new FactData("Person", "p", new ArrayList() , false));
-		sc.fixtures.addAll(Arrays.asList(facts));
+        assertions[2] = new VerifyRuleFired( "rule1",
+                                             1,
+                                             null );
+        assertions[3] = new VerifyRuleFired( "rule2",
+                                             1,
+                                             null );
+        assertions[4] = new VerifyRuleFired( "rule3",
+                                             1,
+                                             null );
 
-		ExecutionTrace executionTrace = new ExecutionTrace();
+        sc.fixtures.addAll( Arrays.asList( assertions ) );
 
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.Person" );
 
-		sc.rules.add("rule1");
-		sc.rules.add("rule2");
-		sc.inclusive = true;
-		sc.fixtures.add(executionTrace);
+        WorkingMemory wm = getWorkingMemory( "test_rules2.drl" );
 
-		Expectation[] assertions = new Expectation[5];
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 (InternalWorkingMemory) wm );
 
-		assertions[0] =	new VerifyFact("c1", ls(
-					new VerifyField("type", "cheddar", "==")
+        assertEquals( 3,
+                      executionTrace.numberOfRulesFired.intValue() );
 
-		));
+        assertSame( run.scenario,
+                    sc );
 
-		assertions[1] = new VerifyFact("p", ls(
-					new VerifyField("name", "rule1", "=="),
-					new VerifyField("status", "rule2", "=="))
+        assertTrue( sc.wasSuccessful() );
 
-		);
+        Person p = (Person) run.globalData.get( "p" );
+        assertEquals( "rule1",
+                      p.getName() );
+        assertEquals( "rule2",
+                      p.getStatus() );
+        assertEquals( 0,
+                      p.getAge() );
 
-		assertions[2] = new VerifyRuleFired("rule1", 1, null);
-		assertions[3] = new VerifyRuleFired("rule2", 1, null);
-		assertions[4] = new VerifyRuleFired("rule3", 1, null);
+        Thread.sleep( 50 );
 
-		sc.fixtures.addAll(Arrays.asList(assertions));
+        assertTrue( (new Date()).after( sc.lastRunResult ) );
+        assertTrue( executionTrace.executionTimeResult != null );
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
-		resolver.addImport("org.drools.Person");
+    }
 
-        WorkingMemory wm = getWorkingMemory("test_rules2.drl");
+    public void testIntgerationStateful() throws Exception {
+        Scenario sc = new Scenario();
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "price",
+                                                          "1" ) ),
+                                       false ) );
+        ExecutionTrace ex = new ExecutionTrace();
+        sc.fixtures.add( ex );
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c2",
+                                       ls( new FieldData( "price",
+                                                          "2" ) ),
+                                       false ) );
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "rule1",
+                                                              "==" ) ) ) );
+        ex = new ExecutionTrace();
+        sc.fixtures.add( ex );
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "rule2",
+                                                              "==" ) ) ) );
 
-        ScenarioRunner run = new ScenarioRunner(sc, resolver, (InternalWorkingMemory) wm);
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
-        assertEquals(3, executionTrace.numberOfRulesFired.intValue());
+        WorkingMemory wm = getWorkingMemory( "test_stateful.drl" );
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 (InternalWorkingMemory) wm );
 
-        assertSame(run.scenario, sc);
+        Cheese c1 = (Cheese) run.populatedData.get( "c1" );
+        Cheese c2 = (Cheese) run.populatedData.get( "c2" );
 
-        assertTrue(sc.wasSuccessful());
+        assertEquals( "rule2",
+                      c1.getType() );
+        assertEquals( "rule2",
+                      c2.getType() );
 
-        Person p = (Person) run.globalData.get("p");
-        assertEquals("rule1", p.getName());
-        assertEquals("rule2", p.getStatus());
-        assertEquals(0, p.getAge());
+        assertTrue( sc.wasSuccessful() );
 
-        Thread.sleep(50);
+    }
 
-        assertTrue((new Date()).after(sc.lastRunResult));
-        assertTrue(executionTrace.executionTimeResult != null);
+    public void testIntegrationWithModify() throws Exception {
+        Scenario sc = new Scenario();
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "price",
+                                                          "1" ) ),
+                                       false ) );
 
-	}
+        sc.fixtures.add( new ExecutionTrace() );
 
-	public void testIntgerationStateful() throws Exception {
-		Scenario sc = new Scenario();
-		sc.fixtures.add(new FactData("Cheese", "c1", ls(new FieldData("price", "1")), false));
-		ExecutionTrace ex = new ExecutionTrace();
-		sc.fixtures.add(ex);
-		sc.fixtures.add(new FactData("Cheese", "c2", ls(new FieldData("price", "2")), false));
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "rule1", "=="))));
-		ex = new ExecutionTrace();
-		sc.fixtures.add(ex);
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "rule2", "=="))));
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "rule1",
+                                                              "==" ) ) ) );
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "price",
+                                                          "42" ) ),
+                                       true ) );
+        sc.fixtures.add( new ExecutionTrace() );
 
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "rule3",
+                                                              "==" ) ) ) );
 
-        WorkingMemory wm = getWorkingMemory("test_stateful.drl");
-        ScenarioRunner run = new ScenarioRunner(sc, resolver, (InternalWorkingMemory) wm);
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
-        Cheese c1 = (Cheese) run.populatedData.get("c1");
-        Cheese c2 = (Cheese) run.populatedData.get("c2");
+        WorkingMemory wm = getWorkingMemory( "test_stateful.drl" );
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 (InternalWorkingMemory) wm );
 
-        assertEquals("rule2", c1.getType());
-        assertEquals("rule2", c2.getType());
+        Cheese c1 = (Cheese) run.populatedData.get( "c1" );
 
-        assertTrue(sc.wasSuccessful());
+        assertEquals( "rule3",
+                      c1.getType() );
 
+        assertTrue( sc.wasSuccessful() );
+    }
 
-	}
+    public void testIntegrationWithRetract() throws Exception {
+        Scenario sc = new Scenario();
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "price",
+                                                          "46" ),
+                                           new FieldData( "type",
+                                                          "XXX" ) ),
+                                       false ) );
+        sc.fixtures.add( new FactData( "Cheese",
+                                       "c2",
+                                       ls( new FieldData( "price",
+                                                          "42" ) ),
+                                       false ) );
+        sc.fixtures.add( new ExecutionTrace() );
 
-	public void testIntegrationWithModify() throws Exception {
-		Scenario sc = new Scenario();
-		sc.fixtures.add(new FactData("Cheese", "c1", ls(new FieldData("price", "1")), false));
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "XXX",
+                                                              "==" ) ) ) );
 
-		sc.fixtures.add(new ExecutionTrace());
+        sc.fixtures.add( new RetractFact( "c2" ) );
+        sc.fixtures.add( new ExecutionTrace() );
 
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "rule1", "=="))));
+        sc.fixtures.add( new VerifyFact( "c1",
+                                         ls( new VerifyField( "type",
+                                                              "rule4",
+                                                              "==" ) ) ) );
 
-		sc.fixtures.add(new FactData("Cheese", "c1", ls(new FieldData("price", "42")), true));
-		sc.fixtures.add(new ExecutionTrace());
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
 
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "rule3", "=="))));
+        WorkingMemory wm = getWorkingMemory( "test_stateful.drl" );
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 (InternalWorkingMemory) wm );
 
+        Cheese c1 = (Cheese) run.populatedData.get( "c1" );
 
+        assertEquals( "rule4",
+                      c1.getType() );
+        assertFalse( run.populatedData.containsKey( "c2" ) );
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+        assertTrue( sc.wasSuccessful() );
+    }
 
+    public void testIntegrationWithFailure() throws Exception {
+        Scenario sc = new Scenario();
+        FactData[] facts = new FactData[]{new FactData( "Cheese",
+                                                        "c1",
+                                                        ls( new FieldData( "type",
+                                                                           "cheddar" ),
+                                                            new FieldData( "price",
+                                                                           "42" ) ),
+                                                        false )
 
-        WorkingMemory wm = getWorkingMemory("test_stateful.drl");
-        ScenarioRunner run = new ScenarioRunner(sc, resolver, (InternalWorkingMemory) wm);
+        };
+        sc.fixtures.addAll( Arrays.asList( facts ) );
+        sc.globals.add( new FactData( "Person",
+                                      "p",
+                                      new ArrayList(),
+                                      false ) );
 
-        Cheese c1 = (Cheese) run.populatedData.get("c1");
+        ExecutionTrace executionTrace = new ExecutionTrace();
+        sc.rules.add( "rule1" );
+        sc.rules.add( "rule2" );
+        sc.inclusive = true;
+        sc.fixtures.add( executionTrace );
 
+        Expectation[] assertions = new Expectation[5];
 
-        assertEquals("rule3", c1.getType());
+        assertions[0] = new VerifyFact( "c1",
+                                        ls( new VerifyField( "type",
+                                                             "cheddar",
+                                                             "==" )
 
+                                        ) );
 
-        assertTrue(sc.wasSuccessful());
-	}
+        assertions[1] = new VerifyFact( "p",
+                                        ls( new VerifyField( "name",
+                                                             "XXX",
+                                                             "==" ),
+                                            new VerifyField( "status",
+                                                             "rule2",
+                                                             "==" )
 
-	public void testIntegrationWithRetract() throws Exception {
-		Scenario sc = new Scenario();
-		sc.fixtures.add(new FactData("Cheese", "c1", ls(new FieldData("price", "46"), new FieldData("type", "XXX")), false));
-		sc.fixtures.add(new FactData("Cheese", "c2", ls(new FieldData("price", "42")), false));
-		sc.fixtures.add(new ExecutionTrace());
+                                        ) );
 
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "XXX", "=="))));
+        assertions[2] = new VerifyRuleFired( "rule1",
+                                             1,
+                                             null );
+        assertions[3] = new VerifyRuleFired( "rule2",
+                                             1,
+                                             null );
+        assertions[4] = new VerifyRuleFired( "rule3",
+                                             2,
+                                             null );
 
-		sc.fixtures.add(new RetractFact("c2"));
-		sc.fixtures.add(new ExecutionTrace());
+        sc.fixtures.addAll( Arrays.asList( assertions ) );
 
-		sc.fixtures.add(new VerifyFact("c1", ls(new VerifyField("type", "rule4", "=="))));
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.Person" );
 
+        WorkingMemory wm = getWorkingMemory( "test_rules2.drl" );
 
+        ScenarioRunner run = new ScenarioRunner( sc,
+                                                 resolver,
+                                                 (InternalWorkingMemory) wm );
 
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
+        assertSame( run.scenario,
+                    sc );
 
+        assertFalse( sc.wasSuccessful() );
 
-        WorkingMemory wm = getWorkingMemory("test_stateful.drl");
-        ScenarioRunner run = new ScenarioRunner(sc, resolver, (InternalWorkingMemory) wm);
-
-        Cheese c1 = (Cheese) run.populatedData.get("c1");
-
-        assertEquals("rule4", c1.getType());
-        assertFalse(run.populatedData.containsKey("c2"));
-
-        assertTrue(sc.wasSuccessful());
-	}
-
-	public void testIntegrationWithFailure() throws Exception {
-		Scenario sc = new Scenario();
-		FactData[] facts = new FactData[] {
-				new FactData("Cheese", "c1", ls(
-						new FieldData("type", "cheddar"),
-						new FieldData("price", "42") ), false)
-
-				};
-		sc.fixtures.addAll(Arrays.asList(facts));
-		sc.globals.add(new FactData("Person", "p", new ArrayList() , false));
-
-		ExecutionTrace executionTrace = new ExecutionTrace();
-		sc.rules.add("rule1");
-		sc.rules.add("rule2");
-		sc.inclusive = true;
-		sc.fixtures.add(executionTrace);
-
-		Expectation[] assertions = new Expectation[5];
-
-		assertions[0] =	new VerifyFact("c1", ls(
-					new VerifyField("type", "cheddar", "==")
-
-		));
-
-		assertions[1] = new VerifyFact("p", ls(
-					new VerifyField("name", "XXX", "=="),
-					new VerifyField("status", "rule2", "==")
-
-		));
-
-		assertions[2] = new VerifyRuleFired("rule1", 1, null);
-		assertions[3] = new VerifyRuleFired("rule2", 1, null);
-		assertions[4] = new VerifyRuleFired("rule3", 2, null);
-
-		sc.fixtures.addAll(Arrays.asList(assertions));
-
-		TypeResolver resolver = new ClassTypeResolver(new HashSet<Object>(),
-				Thread.currentThread().getContextClassLoader());
-		resolver.addImport("org.drools.Cheese");
-		resolver.addImport("org.drools.Person");
-
-        WorkingMemory wm = getWorkingMemory("test_rules2.drl");
-
-        ScenarioRunner run = new ScenarioRunner(sc, resolver, (InternalWorkingMemory) wm);
-
-        assertSame(run.scenario, sc);
-
-        assertFalse(sc.wasSuccessful());
-
         VerifyFact vf = (VerifyFact) assertions[1];
-        assertFalse(((VerifyField)vf.fieldValues.get(0)).successResult);
-        assertEquals("XXX", ((VerifyField)vf.fieldValues.get(0)).expected);
-        assertEquals("rule1",((VerifyField) vf.fieldValues.get(0)).actualResult);
-        assertNotNull(((VerifyField) vf.fieldValues.get(0)).explanation);
+        assertFalse( ((VerifyField) vf.fieldValues.get( 0 )).successResult );
+        assertEquals( "XXX",
+                      ((VerifyField) vf.fieldValues.get( 0 )).expected );
+        assertEquals( "rule1",
+                      ((VerifyField) vf.fieldValues.get( 0 )).actualResult );
+        assertNotNull( ((VerifyField) vf.fieldValues.get( 0 )).explanation );
 
         VerifyRuleFired vr = (VerifyRuleFired) assertions[4];
-        assertFalse(vr.successResult);
+        assertFalse( vr.successResult );
 
-        assertEquals(2, vr.expectedCount.intValue());
-        assertEquals(1, vr.actualResult.intValue());
+        assertEquals( 2,
+                      vr.expectedCount.intValue() );
+        assertEquals( 1,
+                      vr.actualResult.intValue() );
 
+    }
 
-	}
+    private <T> List<T> ls(T... objects) {
+        return Arrays.asList( objects );
+    }
 
-
-
-
-	private<T> List<T> ls(T... objects) {
-		return Arrays.asList(objects);
-	}
-
-
-
-
 }

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator)

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,100 +0,0 @@
-package test;
-
-import java.lang.*;
-import org.drools.integrationtests.eventgenerator.*;
-import org.drools.integrationtests.eventgenerator.example.*;
-
-
-rule "Rule 1: check for expiry of sliding window (and reset window)"
-	no-loop true
-	#salience 0
-	when
-		PseudoSessionClock ( $currentTime : currentTime )
-		$sw : SlidingWindow ( state == SlidingWindow.DEFAULT, $windowStart : windowStart, $windowEnd : windowEnd < $currentTime )
-	then
-		System.out.println ("RULE 1  \"SLIDING WINDOW EXPIRED\" FIRED  : Sliding window "+$sw.getId()+" of Resource " + $sw.getParentId() + " has expired at (" + Tools.formattedDate($currentTime) +");  collecting follows");
-		//$sw.setLastUpdate($currentTime);
-		$sw.setState(SlidingWindow.COLLECT);
-		update ($sw);
-end
-
-rule "Rule 2: collect specified objects within sliding window"
-	no-loop true
-	#salience 0
-	when
-		$sw : SlidingWindow ( state == SlidingWindow.COLLECT, $windowStart : windowStart, $windowEnd : windowEnd )
-        $evCount : Number()
-            from accumulate ( i: ProductionEvent( parentId == $sw.parentId, startTime >= $windowStart, endTime <= $windowEnd), 
-            				  count(i) )
-	then
-		System.out.println ("RULE 2  \"ACCUMULATE EVENTS IN SW\" FIRED : Found "+$evCount.intValue()+" PRODUCTION events within sliding window "+$sw.getId()+"("+Tools.formattedInterval($windowStart, $windowEnd)+");  evaluation follows");
-		//$sw.setEventsInWindow($swQ);
-		$sw.setNumberEvents($evCount.intValue());
-		$sw.setState(SlidingWindow.EVALUATE);
-		update ($sw);
-end
-
-rule "Rule 3a: number events abnormal; set status of NON-RED resource to RED"
-	no-loop true
-	salience 0
-	when
-		$stat : Status ( id == Status.OPERATIONAL, currentValue != Resource.STATUS_RED )
-		$sw : SlidingWindow ( parentId == $stat.resourceId, state == SlidingWindow.EVALUATE, numberEvents < 80 || > 95 ) 
-	then
-		System.out.println ("RULE 3a \"EVALUATION OF SW\" FIRED        : The number of PRODUCTION events found ("+$sw.getNumberEvents() +") within sliding window " + $sw.getId() + " is abnormal;");
-		System.out.println ("                                          Resource "+ $sw.getParentId() +" has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + " and needs to be set to " + Resource.OPERATIONAL_STATUS_VALUES[Resource.STATUS_RED] + ";  advance follows");
-		$sw.setState(SlidingWindow.ADVANCE);
-		update ($sw);
-		SimpleEventGenerator.sendGeneratedEvent(new StatusChangedEvent($sw.getParentId(), $stat.getCurrentValue(), Resource.STATUS_RED, $sw.getLastUpdate(), $sw.getLastUpdate()));
-end
-
-rule "Rule 3b: number events normal; set status of NON-GREEN resource to GREEN"
-	no-loop true
-	salience 0
-	when
-		$stat : Status ( id == Status.OPERATIONAL, currentValue != Resource.STATUS_GREEN )
-		$sw : SlidingWindow ( parentId == $stat.resourceId, state == SlidingWindow.EVALUATE, numberEvents >= 80 && <= 95 ) 
-	then
-		System.out.println ("RULE 3b \"EVALUATION OF SW\" FIRED        : The number of PRODUCTION events found ("+$sw.getNumberEvents() +") within sliding window " + $sw.getId() + " is within the expected range;");
-		System.out.println ("                                          Resource "+ $sw.getParentId() +" has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + " and can be set to " + Resource.OPERATIONAL_STATUS_VALUES[Resource.STATUS_GREEN] + ";  advance follows");
-		$sw.setState(SlidingWindow.ADVANCE);
-		update ($sw);
-		SimpleEventGenerator.sendGeneratedEvent(new StatusChangedEvent($sw.getParentId(), $stat.getCurrentValue(), Resource.STATUS_GREEN, $sw.getLastUpdate(), $sw.getLastUpdate()));
-end
-
-rule "Rule 3c: none of the above conditions apply; however, the sliding window need to be advanced"
-	no-loop true
-	salience -1
-	when
-		$stat : Status ( id == Status.OPERATIONAL )
-		$sw : SlidingWindow ( state == SlidingWindow.EVALUATE ) 
-	then
-		System.out.println ("RULE 3c \"EVALUATION OF SW\" FIRED        : No change of the state of the resource "+ $sw.getParentId() +" required;");
-		System.out.println ("                                          Found "+$sw.getNumberEvents() +" PRODUCTION events within sliding window " + $sw.getId() +"; resource has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + ";  advance follows");
-		$sw.setState(SlidingWindow.ADVANCE);
-		update ($sw);
-end
-
-rule "Rule 4: do nothing but advancing the window"
-	no-loop true
-	salience -1
-	when
-		$sw : SlidingWindow ( state == SlidingWindow.ADVANCE ) 
-	then
-		$sw.advance();
-		System.out.println ("RULE 4  \"ADVANCE SLIDING WINDOW\" FIRED  : Reset sliding window to "+Tools.formattedInterval($sw.getWindowStart(), $sw.getWindowEnd())+";  action follows");
-		$sw.setState(SlidingWindow.DEFAULT);
-		update ($sw);
-end
-
-rule "Rule 5: status changed event - set resource status to desired value"
-	no-loop true
-	when
-		$stat : Status ( id == Status.OPERATIONAL ) 
-		$stChEv : StatusChangedEvent( parentId == $stat.resourceId )
-	then
-		System.out.println ("RULE 5  \"CHANGE STATUS\" FIRED           : Change status from resource " + $stChEv.getParentId() + " from " + $stChEv.getParamOldValue() + " to " + $stChEv.getParamNewValue() + " (" + Tools.formattedDate($stChEv.getEndTime()) +")");
-		$stat.switchCurrentValue($stChEv.getParamOldValue(), $stChEv.getParamNewValue(), $stChEv.getEndTime());
-		update ($stat);
-		retract ($stChEv);
-end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/example_scenario.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,100 @@
+package test;
+
+import java.lang.*;
+import org.drools.integrationtests.eventgenerator.*;
+import org.drools.integrationtests.eventgenerator.example.*;
+
+
+rule "Rule 1: check for expiry of sliding window (and reset window)"
+	no-loop true
+	#salience 0
+	when
+		PseudoSessionClock ( $currentTime : currentTime )
+		$sw : SlidingWindow ( state == SlidingWindow.DEFAULT, $windowStart : windowStart, $windowEnd : windowEnd < $currentTime )
+	then
+		System.out.println ("RULE 1  \"SLIDING WINDOW EXPIRED\" FIRED  : Sliding window "+$sw.getId()+" of Resource " + $sw.getParentId() + " has expired at (" + Tools.formattedDate($currentTime) +");  collecting follows");
+		//$sw.setLastUpdate($currentTime);
+		$sw.setState(SlidingWindow.COLLECT);
+		update ($sw);
+end
+
+rule "Rule 2: collect specified objects within sliding window"
+	no-loop true
+	#salience 0
+	when
+		$sw : SlidingWindow ( state == SlidingWindow.COLLECT, $windowStart : windowStart, $windowEnd : windowEnd )
+        $evCount : Number()
+            from accumulate ( i: ProductionEvent( parentId == $sw.parentId, startTime >= $windowStart, endTime <= $windowEnd), 
+            				  count(i) )
+	then
+		System.out.println ("RULE 2  \"ACCUMULATE EVENTS IN SW\" FIRED : Found "+$evCount.intValue()+" PRODUCTION events within sliding window "+$sw.getId()+"("+Tools.formattedInterval($windowStart, $windowEnd)+");  evaluation follows");
+		//$sw.setEventsInWindow($swQ);
+		$sw.setNumberEvents($evCount.intValue());
+		$sw.setState(SlidingWindow.EVALUATE);
+		update ($sw);
+end
+
+rule "Rule 3a: number events abnormal; set status of NON-RED resource to RED"
+	no-loop true
+	salience 0
+	when
+		$stat : Status ( id == Status.OPERATIONAL, currentValue != Resource.STATUS_RED )
+		$sw : SlidingWindow ( parentId == $stat.resourceId, state == SlidingWindow.EVALUATE, numberEvents < 80 || > 95 ) 
+	then
+		System.out.println ("RULE 3a \"EVALUATION OF SW\" FIRED        : The number of PRODUCTION events found ("+$sw.getNumberEvents() +") within sliding window " + $sw.getId() + " is abnormal;");
+		System.out.println ("                                          Resource "+ $sw.getParentId() +" has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + " and needs to be set to " + Resource.OPERATIONAL_STATUS_VALUES[Resource.STATUS_RED] + ";  advance follows");
+		$sw.setState(SlidingWindow.ADVANCE);
+		update ($sw);
+		SimpleEventGenerator.sendGeneratedEvent(new StatusChangedEvent($sw.getParentId(), $stat.getCurrentValue(), Resource.STATUS_RED, $sw.getLastUpdate(), $sw.getLastUpdate()));
+end
+
+rule "Rule 3b: number events normal; set status of NON-GREEN resource to GREEN"
+	no-loop true
+	salience 0
+	when
+		$stat : Status ( id == Status.OPERATIONAL, currentValue != Resource.STATUS_GREEN )
+		$sw : SlidingWindow ( parentId == $stat.resourceId, state == SlidingWindow.EVALUATE, numberEvents >= 80 && <= 95 ) 
+	then
+		System.out.println ("RULE 3b \"EVALUATION OF SW\" FIRED        : The number of PRODUCTION events found ("+$sw.getNumberEvents() +") within sliding window " + $sw.getId() + " is within the expected range;");
+		System.out.println ("                                          Resource "+ $sw.getParentId() +" has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + " and can be set to " + Resource.OPERATIONAL_STATUS_VALUES[Resource.STATUS_GREEN] + ";  advance follows");
+		$sw.setState(SlidingWindow.ADVANCE);
+		update ($sw);
+		SimpleEventGenerator.sendGeneratedEvent(new StatusChangedEvent($sw.getParentId(), $stat.getCurrentValue(), Resource.STATUS_GREEN, $sw.getLastUpdate(), $sw.getLastUpdate()));
+end
+
+rule "Rule 3c: none of the above conditions apply; however, the sliding window need to be advanced"
+	no-loop true
+	salience -1
+	when
+		$stat : Status ( id == Status.OPERATIONAL )
+		$sw : SlidingWindow ( state == SlidingWindow.EVALUATE ) 
+	then
+		System.out.println ("RULE 3c \"EVALUATION OF SW\" FIRED        : No change of the state of the resource "+ $sw.getParentId() +" required;");
+		System.out.println ("                                          Found "+$sw.getNumberEvents() +" PRODUCTION events within sliding window " + $sw.getId() +"; resource has status " + Resource.OPERATIONAL_STATUS_VALUES[$stat.getCurrentValue()] + ";  advance follows");
+		$sw.setState(SlidingWindow.ADVANCE);
+		update ($sw);
+end
+
+rule "Rule 4: do nothing but advancing the window"
+	no-loop true
+	salience -1
+	when
+		$sw : SlidingWindow ( state == SlidingWindow.ADVANCE ) 
+	then
+		$sw.advance();
+		System.out.println ("RULE 4  \"ADVANCE SLIDING WINDOW\" FIRED  : Reset sliding window to "+Tools.formattedInterval($sw.getWindowStart(), $sw.getWindowEnd())+";  action follows");
+		$sw.setState(SlidingWindow.DEFAULT);
+		update ($sw);
+end
+
+rule "Rule 5: status changed event - set resource status to desired value"
+	no-loop true
+	when
+		$stat : Status ( id == Status.OPERATIONAL ) 
+		$stChEv : StatusChangedEvent( parentId == $stat.resourceId )
+	then
+		System.out.println ("RULE 5  \"CHANGE STATUS\" FIRED           : Change status from resource " + $stChEv.getParentId() + " from " + $stChEv.getParamOldValue() + " to " + $stChEv.getParamNewValue() + " (" + Tools.formattedDate($stChEv.getEndTime()) +")");
+		$stat.switchCurrentValue($stChEv.getParamOldValue(), $stChEv.getParamNewValue(), $stChEv.getEndTime());
+		update ($stat);
+		retract ($stChEv);
+end
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,23 +0,0 @@
-package test;
-
-import org.drools.integrationtests.eventgenerator.*;
-
-query "all inserted events"
-	Event()
-end
-
-query "all inserted events with generation time < 1 min"
-	Event(eval(endTime<PseudoSessionClock.timeInMinutes(1)))
-end
-
-query "all inserted events with 2 min < generation time < 3 min"
-	Event(eval (endTime>PseudoSessionClock.timeInMinutes(2)), eval(endTime<PseudoSessionClock.timeInMinutes(3)))
-end
-
-query "all inserted events with parent resource A"
-	Event(parentId=="resA")
-end
-
-query "all inserted events with parent resource B"
-	Event(parentId=="resB")
-end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,23 @@
+package test;
+
+import org.drools.integrationtests.eventgenerator.*;
+
+query "all inserted events"
+	Event()
+end
+
+query "all inserted events with generation time < 1 min"
+	Event(eval(endTime<PseudoSessionClock.timeInMinutes(1)))
+end
+
+query "all inserted events with 2 min < generation time < 3 min"
+	Event(eval (endTime>PseudoSessionClock.timeInMinutes(2)), eval(endTime<PseudoSessionClock.timeInMinutes(3)))
+end
+
+query "all inserted events with parent resource A"
+	Event(parentId=="resA")
+end
+
+query "all inserted events with parent resource B"
+	Event(parentId=="resB")
+end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleEventAssertion.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleEventAssertion.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleEventAssertion.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleEventAssertion.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,12 @@
+package org.drools;
+
+import event org.drools.StockTick;
+
+global java.util.List results;
+
+rule "Check event"
+when
+    $st : StockTick( company == "ACME" )
+then
+    results.add( $st );
+end

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleTimeWindow.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleTimeWindow.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleTimeWindow.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_SimpleTimeWindow.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,16 @@
+package org.drools;
+
+import event org.drools.OrderEvent;
+
+global java.util.List results;
+
+rule "average over threshold"
+when
+    Number( $avg : intValue >= 50 ) from accumulate(
+              OrderEvent( $amt : total ),
+              average( $amt ) )
+then
+    //System.out.println( "Over threshold: "+$avg );
+    results.add( $avg );
+end
+

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,13 @@
+package org.drools;
+
+import event org.drools.StockTick;
+
+global java.util.List results;
+
+rule "after operator"
+when
+    $a : StockTick( company == "DROO" )
+    $b : StockTick( company == "ACME", this ~after[5,10] $a )
+then
+    results.add( $b );
+end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/import_event.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/lang/import_event.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/import_event.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/import_event.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,9 @@
+package org.drools;
+
+import event org.drools.StockTick;
+
+rule "Check event"
+when
+    StockTick( company == "ACME" )
+then
+end

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/pluggable_operators.drl	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,11 @@
+package org.drools;
+
+rule "test pluggable operators"
+when
+    $a : EventA()
+    $b : EventB( this ~after[1,10] $a )
+    $c : EventC( this ~finishes $b )
+    $d : EventD( this not ~starts $a )
+    $e : EventE( this not ~before [1, 10] $b )
+then
+end
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ClockType.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/ClockType.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ClockType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/ClockType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 29, 2007
+ */
+package org.drools;
+
+import org.drools.temporal.SessionClock;
+import org.drools.temporal.SessionPseudoClock;
+
+/**
+ * This enum represents all engine supported clocks
+ * 
+ * @author etirelli
+ */
+public enum ClockType {
+//  SYSTEM_CLOCK {
+//      public SessionClock newInstance() {
+//          return new SessionPseudoClock();
+//      }
+//  },
+  
+  /**
+   * A Pseudo clock is a clock that is completely controled by the
+   * client application. It is usually used during simulations or tests
+   */
+  PSEUDO_CLOCK {
+      public SessionPseudoClock createInstance() {
+          return new SessionPseudoClock();
+      }
+  };
+  
+  public abstract SessionClock createInstance();
+  
+}
+

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -94,8 +94,25 @@
      */
     StatefulSession newStatefulSession(InputStream stream) throws IOException,
                                                           ClassNotFoundException;
+    
+    /**
+     * Creates a new temporal session using the defined clock type.
+     * 
+     * @param clockType
+     * @return
+     */
+    TemporalSession newTemporalSession(ClockType clockType);
 
     /**
+     * Creates a new temporal session using the defined clock type.
+     * 
+     * @param keepReference maintains a reference in the rulebase to the created session
+     * @param clockType
+     * @return
+     */
+    TemporalSession newTemporalSession(boolean keepReference, ClockType clockType);
+
+    /**
      * RuleBases handle the returning of a Serialized WorkingMemory
      * pass as an InputStream. If the reference is a byte[] then
      * wrap with new ByteArrayInputStream. Optionally the RuleBase retains a

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	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -26,9 +26,10 @@
 import org.drools.common.AgendaGroupFactory;
 import org.drools.common.ArrayAgendaGroupFactory;
 import org.drools.common.PriorityQueueAgendaGroupFactory;
-import org.drools.concurrent.ExecutorService;
 import org.drools.spi.ConflictResolver;
 import org.drools.spi.ConsequenceExceptionHandler;
+import org.drools.temporal.SessionClock;
+import org.drools.temporal.SessionPseudoClock;
 import org.drools.util.ChainedProperties;
 
 /**
@@ -66,42 +67,44 @@
  * drools.conflictResolver = <qualified class name>
  * drools.consequenceExceptionHandler = <qualified class name>
  * drools.ruleBaseUpdateHandler = <qualified class name>
+ * drools.sessionClock = <qualified class name>
  * 
  */
 public class RuleBaseConfiguration
     implements
     Serializable {
-    private static final long           serialVersionUID = 400L;
+    private static final long              serialVersionUID = 400L;
 
-    private ChainedProperties           chainedProperties;
+    private ChainedProperties              chainedProperties;
 
-    private boolean                     immutable;
+    private boolean                        immutable;
 
-    private boolean                     sequential;
-    private SequentialAgenda            sequentialAgenda;
+    private boolean                        sequential;
+    private SequentialAgenda               sequentialAgenda;
 
-    private boolean                     maintainTms;
-    private boolean                     removeIdentities;
-    private boolean                     shareAlphaNodes;
-    private boolean                     shareBetaNodes;
-    private boolean                     alphaMemory;
-    private int                         alphaNodeHashingThreshold;
-    private int                         compositeKeyDepth;
-    private boolean                     indexLeftBetaMemory;
-    private boolean                     indexRightBetaMemory;
-    private AssertBehaviour             assertBehaviour;
-    private LogicalOverride             logicalOverride;
-    private String                      executorService;
-    private ConsequenceExceptionHandler consequenceExceptionHandler;
-    private String                      ruleBaseUpdateHandler;
+    private boolean                        maintainTms;
+    private boolean                        removeIdentities;
+    private boolean                        shareAlphaNodes;
+    private boolean                        shareBetaNodes;
+    private boolean                        alphaMemory;
+    private int                            alphaNodeHashingThreshold;
+    private int                            compositeKeyDepth;
+    private boolean                        indexLeftBetaMemory;
+    private boolean                        indexRightBetaMemory;
+    private AssertBehaviour                assertBehaviour;
+    private LogicalOverride                logicalOverride;
+    private String                         executorService;
+    private ConsequenceExceptionHandler    consequenceExceptionHandler;
+    private String                         ruleBaseUpdateHandler;
+    private Class< ? extends SessionClock> sessionClockClass;
 
-    private ConflictResolver            conflictResolver;
+    private ConflictResolver               conflictResolver;
 
-    private boolean                     shadowProxy;
-    private Map                         shadowProxyExcludes;
-    private static final String         STAR             = "*";
+    private boolean                        shadowProxy;
+    private Map                            shadowProxyExcludes;
+    private static final String            STAR             = "*";
 
-    private transient ClassLoader       classLoader;
+    private transient ClassLoader          classLoader;
 
     /**
      * Creates a new rulebase configuration using the provided properties
@@ -217,9 +220,9 @@
 
         setConsequenceExceptionHandler( RuleBaseConfiguration.determineConsequenceExceptionHandler( this.chainedProperties.getProperty( "drools.consequenceExceptionHandler",
                                                                                                                                         "org.drools.base.DefaultConsequenceExceptionHandler" ) ) );
-        
+
         setRuleBaseUpdateHandler( this.chainedProperties.getProperty( "drools.ruleBaseUpdateHandler",
-                                                                      "org.drools.base.FireAllRulesRuleBaseUpdateListener" ) );        
+                                                                      "org.drools.base.FireAllRulesRuleBaseUpdateListener" ) );
 
         setConflictResolver( RuleBaseConfiguration.determineConflictResolver( this.chainedProperties.getProperty( "drools.conflictResolver",
                                                                                                                   "org.drools.conflict.DepthConflictResolver" ) ) );
@@ -230,6 +233,10 @@
 
         setShadowProxyExcludes( this.chainedProperties.getProperty( "drools.shadowProxyExcludes",
                                                                     "" ) );
+
+        setSessionClockClass( this.chainedProperties.getProperty( "drools.sessionClock",
+                                                                  SessionPseudoClock.class.getName() ) );
+
     }
 
     /**
@@ -385,7 +392,7 @@
         checkCanChange(); // throws an exception if a change isn't possible;        
         this.consequenceExceptionHandler = consequenceExceptionHandler;
     }
-    
+
     public String getRuleBaseUpdateHandler() {
         return ruleBaseUpdateHandler;
     }
@@ -393,8 +400,53 @@
     public void setRuleBaseUpdateHandler(String ruleBaseUpdateHandler) {
         checkCanChange(); // throws an exception if a change isn't possible;        
         this.ruleBaseUpdateHandler = ruleBaseUpdateHandler;
-    }    
+    }
 
+    /**
+     * Returns the actual class that is set to be used as the session clock
+     * for sessions of this rulebase
+     *  
+     * @return
+     */
+    public Class< ? extends SessionClock> getSessionClockClass() {
+        return sessionClockClass;
+    }
+
+    /**
+     * Sets the class whose instance is to be used as the session clock 
+     * for sessions of this rulebase
+     * 
+     * @param sessionClockClass
+     */
+    public void setSessionClockClass(Class< ? extends SessionClock> sessionClockClass) {
+        checkCanChange(); // throws an exception if a change isn't possible;        
+        this.sessionClockClass = sessionClockClass;
+    }
+
+    /**
+     * Sets the class name whose instance is to be used as the session clock
+     * for sessions of this rulebase
+     * 
+     * @param className
+     */
+    public void setSessionClockClass(String className) {
+        Class< ? extends SessionClock> sessionClock;
+        try {
+            ClassLoader cl = this.getClassLoader();
+            if ( cl == null ) {
+                cl = Thread.currentThread().getContextClassLoader();
+                if ( cl == null ) {
+                    cl = this.getClass().getClassLoader();
+                }
+            }
+            sessionClock = (Class< ? extends SessionClock>) cl.loadClass( className );
+        } catch ( Exception ex ) {
+            throw new RuntimeDroolsException( "Not possible to load the session clock class: " + className,
+                                              ex );
+        }
+        setSessionClockClass( sessionClock );
+    }
+
     public AgendaGroupFactory getAgendaGroupFactory() {
         if ( isSequential() ) {
             if ( this.sequentialAgenda == SequentialAgenda.SEQUENTIAL ) {
@@ -421,7 +473,7 @@
             // sequential never needs shadowing, so always override
             return false;
         }
-        
+
         if ( userValue != null ) {
             return Boolean.valueOf( userValue ).booleanValue();
         } else {
@@ -545,7 +597,7 @@
     private static ConsequenceExceptionHandler determineConsequenceExceptionHandler(String className) {
         return (ConsequenceExceptionHandler) instantiateClass( "ConsequenceExceptionHandler",
                                                                className );
-    }   
+    }
 
     private static Object instantiateClass(String type,
                                            String className) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/StatefulSession.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -71,5 +71,5 @@
      */
     Future asyncFireAllRules(AgendaFilter agendaFilter);
 
-    public List getRuleBaseUpdateListeners();
+    List getRuleBaseUpdateListeners();
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/TemporalSession.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/TemporalSession.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/TemporalSession.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/TemporalSession.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 28, 2007
+ */
+package org.drools;
+
+import org.drools.temporal.SessionClock;
+
+/**
+ * A StatefulTemporalSession is a stateful session with
+ * additional functionalities for temporal reasoning. 
+ * 
+ * @author etirelli
+ *
+ */
+public interface TemporalSession<T extends SessionClock> extends StatefulSession {
+    
+    /**
+     * Returns the session clock instance for this session.
+     * 
+     * The actual session clock implementation is defined by the
+     * RuleBaseConfiguration.setSessionClockImpl() call or by
+     * setting the corresponding system property.
+     */
+    public T getSessionClock();
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/WorkingMemory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -25,6 +25,7 @@
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.AsyncExceptionHandler;
 import org.drools.spi.GlobalResolver;
+import org.drools.temporal.SessionClock;
 
 /**
  * A knowledge session for a <code>RuleBase</code>.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseEvaluator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,6 +17,7 @@
  */
 
 import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalFactHandle;
 import org.drools.spi.Evaluator;
 
 /**
@@ -47,6 +48,14 @@
         return this.type;
     }
 
+    public ValueType getCoercedValueType() {
+        return this.type;
+    }
+
+    public Object prepareObject(InternalFactHandle handle) {
+        return handle.getObject();
+    }
+    
     public boolean equals(final Object object) {
         if ( this == object ) {
             return true;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -32,15 +32,15 @@
     /**
      * 
      */
-    private static final long              serialVersionUID = 400L;
+    private static final long serialVersionUID = 400L;
 
     /** Java object class. */
-    protected Class                        objectTypeClass;
+    protected Class           objectTypeClass;
 
-    protected ValueType                    valueType;
+    protected ValueType       valueType;
 
+    private boolean           isEvent;
 
-
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -52,9 +52,21 @@
      *            Java object class.
      */
     public ClassObjectType(final Class objectTypeClass) {
+        this( objectTypeClass, false );
+    }
+
+    /**
+     * Creates a new class object type
+     * 
+     * @param objectTypeClass the class represented by this class object type
+     * @param isEvent true if it is an event class, false otherwise
+     */
+    public ClassObjectType(final Class objectTypeClass, final boolean isEvent) {
         this.objectTypeClass = objectTypeClass;
+        this.isEvent = isEvent;
         this.valueType = ValueType.determineValueType( objectTypeClass );
     }
+
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------
@@ -99,25 +111,33 @@
     public boolean matches(final Object object) {
         return getClassType().isInstance( object );
     }
-    
+
     public boolean isAssignableFrom(Object object) {
         return this.objectTypeClass.isAssignableFrom( (Class) object );
     }
 
     public boolean isAssignableFrom(ObjectType objectType) {
-        if ( !( objectType instanceof ClassObjectType ) ) {
+        if ( !(objectType instanceof ClassObjectType) ) {
             return false;
         } else {
             return this.objectTypeClass.isAssignableFrom( ((ClassObjectType) objectType).getClassType() );
         }
-    }    
-    
+    }
+
     public ValueType getValueType() {
         return this.valueType;
     }
 
+    public boolean isEvent() {
+        return isEvent;
+    }
+
+    public void setEvent(boolean isEvent) {
+        this.isEvent = isEvent;
+    }
+
     public String toString() {
-        return "[ClassObjectType class=" + getClassType().getName() + "]";
+        return "[ClassObjectType "+( this.isEvent ? "event=" : "class=" )+ getClassType().getName() + "]";
     }
 
     /**
@@ -137,7 +157,7 @@
         if ( object == null || object.getClass() != ClassObjectType.class ) {
             return false;
         }
-
+        
         return this.objectTypeClass == ((ClassObjectType) object).objectTypeClass;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassTypeResolver.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,12 +16,10 @@
  * limitations under the License.
  */
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -30,7 +28,7 @@
 public class ClassTypeResolver
     implements
     TypeResolver {
-    private Set              imports          = Collections.EMPTY_SET;
+    private Set<String>      imports          = Collections.emptySet();
 
     private ClassLoader      classLoader;
 
@@ -56,7 +54,7 @@
                               "C" );
     }
 
-    public ClassTypeResolver(final Set imports,
+    public ClassTypeResolver(final Set<String> imports,
                              final ClassLoader classLoader) {
         this.imports = imports;
 
@@ -79,7 +77,7 @@
     /* (non-Javadoc)
      * @see org.drools.semantics.java.TypeResolver#getImports()
      */
-    public Set getImports() {
+    public Set<String> getImports() {
         return this.imports;
     }
 
@@ -93,7 +91,7 @@
      */
     public void addImport(final String importEntry) {
         if ( this.imports == Collections.EMPTY_SET ) {
-            this.imports = new HashSet();
+            this.imports = new HashSet<String>();
         }
         this.imports.add( importEntry );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -6,144 +6,100 @@
 import java.util.Date;
 
 import org.drools.RuntimeDroolsException;
-import org.drools.base.evaluators.ArrayFactory;
-import org.drools.base.evaluators.BigDecimalFactory;
-import org.drools.base.evaluators.BigIntegerFactory;
-import org.drools.base.evaluators.BooleanFactory;
-import org.drools.base.evaluators.ByteFactory;
-import org.drools.base.evaluators.CharacterFactory;
-import org.drools.base.evaluators.DateFactory;
-import org.drools.base.evaluators.DoubleFactory;
-import org.drools.base.evaluators.EvaluatorFactory;
-import org.drools.base.evaluators.FloatFactory;
-import org.drools.base.evaluators.IntegerFactory;
-import org.drools.base.evaluators.LongFactory;
-import org.drools.base.evaluators.ObjectFactory;
-import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.ShortFactory;
-import org.drools.base.evaluators.StringFactory;
 import org.drools.facttemplates.FactTemplate;
-import org.drools.spi.Evaluator;
 
 public class ValueType
     implements
     Serializable {
 
-    private static final long      serialVersionUID = 400L;
+    private static final long      serialVersionUID  = 400L;
 
     public static final ValueType  NULL_TYPE         = new ValueType( "null",
                                                                       null,
-                                                                      SimpleValueType.NULL,
-                                                                      null );
+                                                                      SimpleValueType.NULL);
     // wrapper types
     public static final ValueType  CHAR_TYPE         = new ValueType( "Character",
                                                                       Character.class,
-                                                                      SimpleValueType.CHAR,
-                                                                      CharacterFactory.getInstance() );
+                                                                      SimpleValueType.CHAR );
     public static final ValueType  BYTE_TYPE         = new ValueType( "Byte",
                                                                       Byte.class,
-                                                                      SimpleValueType.INTEGER,
-                                                                      ByteFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER);
     public static final ValueType  SHORT_TYPE        = new ValueType( "Short",
                                                                       Short.class,
-                                                                      SimpleValueType.INTEGER,
-                                                                      ShortFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  INTEGER_TYPE      = new ValueType( "Integer",
                                                                       Integer.class,
-                                                                      SimpleValueType.INTEGER,
-                                                                      IntegerFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  LONG_TYPE         = new ValueType( "Long",
                                                                       Long.class,
-                                                                      SimpleValueType.INTEGER,
-                                                                      LongFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  FLOAT_TYPE        = new ValueType( "Float",
                                                                       Float.class,
-                                                                      SimpleValueType.DECIMAL,
-                                                                      FloatFactory.getInstance() );
+                                                                      SimpleValueType.DECIMAL );
     public static final ValueType  DOUBLE_TYPE       = new ValueType( "Double",
                                                                       Double.class,
-                                                                      SimpleValueType.DECIMAL,
-                                                                      DoubleFactory.getInstance() );
+                                                                      SimpleValueType.DECIMAL );
     public static final ValueType  BOOLEAN_TYPE      = new ValueType( "Boolean",
                                                                       Boolean.class,
-                                                                      SimpleValueType.BOOLEAN,
-                                                                      BooleanFactory.getInstance() );
+                                                                      SimpleValueType.BOOLEAN );
     // primitive types
     public static final ValueType  PCHAR_TYPE        = new ValueType( "char",
                                                                       Character.TYPE,
-                                                                      SimpleValueType.CHAR,
-                                                                      CharacterFactory.getInstance() );
+                                                                      SimpleValueType.CHAR );
     public static final ValueType  PBYTE_TYPE        = new ValueType( "byte",
                                                                       Byte.TYPE,
-                                                                      SimpleValueType.INTEGER,
-                                                                      ByteFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  PSHORT_TYPE       = new ValueType( "short",
                                                                       Short.TYPE,
-                                                                      SimpleValueType.INTEGER,
-                                                                      ShortFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  PINTEGER_TYPE     = new ValueType( "int",
                                                                       Integer.TYPE,
-                                                                      SimpleValueType.INTEGER,
-                                                                      IntegerFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  PLONG_TYPE        = new ValueType( "long",
                                                                       Long.TYPE,
-                                                                      SimpleValueType.INTEGER,
-                                                                      LongFactory.getInstance() );
+                                                                      SimpleValueType.INTEGER );
     public static final ValueType  PFLOAT_TYPE       = new ValueType( "float",
                                                                       Float.TYPE,
-                                                                      SimpleValueType.DECIMAL,
-                                                                      FloatFactory.getInstance() );
+                                                                      SimpleValueType.DECIMAL );
     public static final ValueType  PDOUBLE_TYPE      = new ValueType( "double",
                                                                       Double.TYPE,
-                                                                      SimpleValueType.DECIMAL,
-                                                                      DoubleFactory.getInstance() );
+                                                                      SimpleValueType.DECIMAL );
     public static final ValueType  PBOOLEAN_TYPE     = new ValueType( "boolean",
                                                                       Boolean.TYPE,
-                                                                      SimpleValueType.BOOLEAN,
-                                                                      BooleanFactory.getInstance() );
+                                                                      SimpleValueType.BOOLEAN );
     // other types
     public static final ValueType  DATE_TYPE         = new ValueType( "Date",
                                                                       Date.class,
-                                                                      SimpleValueType.DATE,
-                                                                      DateFactory.getInstance() );
+                                                                      SimpleValueType.DATE );
     public static final ValueType  ARRAY_TYPE        = new ValueType( "Array",
                                                                       Object[].class,
-                                                                      SimpleValueType.LIST,
-                                                                      ArrayFactory.getInstance() );
+                                                                      SimpleValueType.LIST );
     public static final ValueType  STRING_TYPE       = new ValueType( "String",
                                                                       String.class,
-                                                                      SimpleValueType.STRING,
-                                                                      StringFactory.getInstance() );
+                                                                      SimpleValueType.STRING );
     public static final ValueType  OBJECT_TYPE       = new ValueType( "Object",
                                                                       Object.class,
-                                                                      SimpleValueType.OBJECT,
-                                                                      ObjectFactory.getInstance() );
+                                                                      SimpleValueType.OBJECT );
     public static final ValueType  FACTTEMPLATE_TYPE = new ValueType( "FactTemplate",
                                                                       FactTemplate.class,
-                                                                      SimpleValueType.UNKNOWN,
-                                                                      ObjectFactory.getInstance() );
+                                                                      SimpleValueType.UNKNOWN );
     public static final ValueType  BIG_DECIMAL_TYPE  = new ValueType( "BigDecimal",
                                                                       BigDecimal.class,
-                                                                      SimpleValueType.OBJECT,
-                                                                      BigDecimalFactory.getInstance() );
+                                                                      SimpleValueType.OBJECT );
     public static final ValueType  BIG_INTEGER_TYPE  = new ValueType( "BigInteger",
                                                                       BigInteger.class,
-                                                                      SimpleValueType.OBJECT,
-                                                                      BigIntegerFactory.getInstance() );
+                                                                      SimpleValueType.OBJECT );
 
     private final String           name;
     private final Class            classType;
-    private final EvaluatorFactory evaluatorFactory;
     private final int              simpleType;
 
     private ValueType(final String name,
                       final Class classType,
-                      final int simpleType,
-                      final EvaluatorFactory evaluatorFactory) {
+                      final int simpleType) {
         this.name = name;
         this.classType = classType;
         this.simpleType = simpleType;
-        this.evaluatorFactory = evaluatorFactory;
     }
 
     private Object readResolve() throws java.io.ObjectStreamException {
@@ -162,10 +118,6 @@
         return this.simpleType;
     }
 
-    public Evaluator getEvaluator(final Operator operator) {
-        return this.evaluatorFactory.getEvaluator( operator );
-    }
-
     public static ValueType determineValueType(final Class clazz) {
         if ( clazz == null ) {
             return ValueType.NULL_TYPE;
@@ -244,42 +196,18 @@
 
     public boolean isNumber() {
         return (this.simpleType == SimpleValueType.INTEGER || this.simpleType == SimpleValueType.DECIMAL || this.simpleType == SimpleValueType.CHAR);
-        //        return (this.classType == Integer.TYPE) || 
-        //               (this.classType == Long.TYPE) || 
-        //               (this.classType == Float.TYPE) || 
-        //               (this.classType == Double.TYPE) ||
-        //               (this.classType == Byte.TYPE) || 
-        //               (this.classType == Short.TYPE) || 
-        //               (this.classType == Character.TYPE) ||
-        //               (this.classType == Character.class) || 
-        //               (Number.class.isAssignableFrom( this.classType ));
     }
 
     public boolean isIntegerNumber() {
         return this.simpleType == SimpleValueType.INTEGER;
-        //        return (this.classType == Integer.TYPE) || 
-        //               (this.classType == Long.TYPE) || 
-        //               (this.classType == Integer.class) || 
-        //               (this.classType == Long.class) || 
-        //               (this.classType == Character.class) || 
-        //               (this.classType == Character.TYPE) ||
-        //               (this.classType == Byte.TYPE) ||
-        //               (this.classType == Short.TYPE) || 
-        //               (this.classType == Byte.class) || 
-        //               (this.classType == Short.class);
     }
 
     public boolean isFloatNumber() {
         return this.simpleType == SimpleValueType.DECIMAL;
-        //        return (this.classType == Float.TYPE) || 
-        //               (this.classType == Double.TYPE) || 
-        //               (this.classType == Float.class) || 
-        //               (this.classType == Double.class);
     }
 
     public boolean isChar() {
         return this.simpleType == SimpleValueType.CHAR;
-        //        return ((this.classType == Character.class) || (this.classType == Character.TYPE));
     }
 
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,389 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ValueType;
+import org.drools.common.EventFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+
+/**
+ * The implementation of the 'after' evaluator definition
+ * 
+ * @author etirelli
+ */
+public class AfterEvaluatorDefinition
+    implements
+    EvaluatorDefinition {
+
+    public static final Operator   AFTER         = Operator.addOperatorToRegistry( "after",
+                                                                                   false );
+    public static final Operator   NOT_AFTER     = Operator.addOperatorToRegistry( "after",
+                                                                                   true );
+
+    private static final String[]  SUPPORTED_IDS = {AFTER.getOperatorString()};
+
+    private Map<String, Evaluator> cache         = Collections.emptyMap();
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.getEvaluator( type,
+                                  operator.getOperatorString(),
+                                  operator.isNegated(),
+                                  null );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.getEvaluator( type,
+                                  operator.getOperatorString(),
+                                  operator.isNegated(),
+                                  parameterText );
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        if ( this.cache == Collections.EMPTY_MAP ) {
+            this.cache = new HashMap<String, Evaluator>();
+        }
+        String key = isNegated + ":" + parameterText;
+        Evaluator eval = this.cache.get( key );
+        if ( eval == null ) {
+            if ( isNegated ) {
+                eval = new NotAfterEvaluator( type,
+                                              isNegated,
+                                              parameterText );
+            } else {
+                eval = new AfterEvaluator( type,
+                                           isNegated,
+                                           parameterText );
+            }
+            this.cache.put( key,
+                            eval );
+        }
+        return eval;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean isNegatable() {
+        return true;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean operatesOnFactHandles() {
+        return true;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean supportsType(ValueType type) {
+        // supports all types, since it operates over fact handles
+        // Note: should we change this interface to allow checking of event classes only?
+        return true;
+    }
+
+    /**
+     * Implements the 'after' evaluator itself
+     */
+    public static class AfterEvaluator extends BaseEvaluator {
+        private static final long serialVersionUID = -4833205637340977934L;
+
+        private long              initRange;
+        private long              finalRange;
+
+        public AfterEvaluator(final ValueType type,
+                              final boolean isNegated,
+                              final String parameters) {
+            super( type,
+                   isNegated ? NOT_AFTER : AFTER );
+            this.parseParameters( parameters );
+        }
+
+        @Override
+        public Object prepareObject(InternalFactHandle handle) {
+            return handle;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            throw new RuntimeDroolsException( "The 'after' operator can only be used to compare one event to another, and never to compare to literal constraints." );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            if ( context.rightNull ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) ((ObjectVariableContextEntry) context).right).getStartTimestamp() - ((EventFactHandle) left).getEndTimestamp();
+            return dist >= this.initRange && dist <= this.finalRange;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            if ( context.extractor.isNullValue( workingMemory,
+                                                right ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) right).getStartTimestamp() - ((EventFactHandle) ((ObjectVariableContextEntry) context).left).getEndTimestamp();
+
+            return dist >= this.initRange && dist <= this.finalRange;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            if ( extractor1.isNullValue( workingMemory,
+                                         object1 ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) object1).getStartTimestamp() - ((EventFactHandle) object2).getEndTimestamp();
+            return dist >= this.initRange && dist <= this.finalRange;
+        }
+
+        public String toString() {
+            return "after[" + initRange + ", " + finalRange + "]";
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = super.hashCode();
+            result = PRIME * result + (int) (finalRange ^ (finalRange >>> 32));
+            result = PRIME * result + (int) (initRange ^ (initRange >>> 32));
+            return result;
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if ( this == obj ) return true;
+            if ( !super.equals( obj ) ) return false;
+            if ( getClass() != obj.getClass() ) return false;
+            final AfterEvaluator other = (AfterEvaluator) obj;
+            return finalRange == other.finalRange && initRange == other.initRange;
+        }
+
+        /**
+         * This methods tries to parse the string of parameters to customize 
+         * the evaluator.
+         * 
+         * @param parameters
+         */
+        private void parseParameters(String parameters) {
+            if ( parameters == null || parameters.trim().length() == 0 ) {
+                // open bounded range
+                this.initRange = 1;
+                this.finalRange = Long.MAX_VALUE;
+                return;
+            }
+
+            try {
+                String[] ranges = parameters.split( "," );
+                if ( ranges.length == 1 ) {
+                    // deterministic point in time
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = this.initRange;
+                } else if ( ranges.length == 2 ) {
+                    // regular range
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = Long.parseLong( ranges[1] );
+                } else {
+                    throw new RuntimeDroolsException( "[After Evaluator]: Not possible to parse parameters: '" + parameters + "'" );
+                }
+            } catch ( NumberFormatException e ) {
+                throw new RuntimeDroolsException( "[After Evaluator]: Not possible to parse parameters: '" + parameters + "'",
+                                                  e );
+            }
+        }
+
+    }
+
+    /**
+     * Implements the 'after' evaluator itself
+     */
+    public static class NotAfterEvaluator extends BaseEvaluator {
+        private static final long serialVersionUID = -4833205637340977934L;
+
+        private long              initRange;
+        private long              finalRange;
+
+        public NotAfterEvaluator(final ValueType type,
+                                 final boolean isNegated,
+                                 final String parameters) {
+            super( type,
+                   isNegated ? NOT_AFTER : AFTER );
+            this.parseParameters( parameters );
+        }
+
+        @Override
+        public Object prepareObject(InternalFactHandle handle) {
+            return handle;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            throw new RuntimeDroolsException( "The 'after' operator can only be used to compare one event to another, and never to compare to literal constraints." );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            if ( context.rightNull ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) ((ObjectVariableContextEntry) context).right).getStartTimestamp() - ((EventFactHandle) left).getEndTimestamp();
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            if ( context.extractor.isNullValue( workingMemory,
+                                                right ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) right).getStartTimestamp() - ((EventFactHandle) ((ObjectVariableContextEntry) context).left).getEndTimestamp();
+
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            if ( extractor1.isNullValue( workingMemory,
+                                         object1 ) ) {
+                return false;
+            }
+            long dist = ((EventFactHandle) object1).getStartTimestamp() - ((EventFactHandle) object2).getEndTimestamp();
+            return dist < this.initRange || dist > this.finalRange;
+        }
+
+        public String toString() {
+            return "not after[" + initRange + ", " + finalRange + "]";
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            final int PRIME = 31;
+            int result = super.hashCode();
+            result = PRIME * result + (int) (finalRange ^ (finalRange >>> 32));
+            result = PRIME * result + (int) (initRange ^ (initRange >>> 32));
+            return result;
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if ( this == obj ) return true;
+            if ( !super.equals( obj ) ) return false;
+            if ( getClass() != obj.getClass() ) return false;
+            final NotAfterEvaluator other = (NotAfterEvaluator) obj;
+            return finalRange == other.finalRange && initRange == other.initRange;
+        }
+
+        /**
+         * This methods tries to parse the string of parameters to customize 
+         * the evaluator.
+         * 
+         * @param parameters
+         */
+        private void parseParameters(String parameters) {
+            if ( parameters == null || parameters.trim().length() == 0 ) {
+                // open bounded range
+                this.initRange = 1;
+                this.finalRange = Long.MAX_VALUE;
+                return;
+            }
+
+            try {
+                String[] ranges = parameters.split( "," );
+                if ( ranges.length == 1 ) {
+                    // deterministic point in time
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = this.initRange;
+                } else if ( ranges.length == 2 ) {
+                    // regular range
+                    this.initRange = Long.parseLong( ranges[0] );
+                    this.finalRange = Long.parseLong( ranges[1] );
+                } else {
+                    throw new RuntimeDroolsException( "[Not After Evaluator]: Not possible to parse parameters: '" + parameters + "'" );
+                }
+            } catch ( NumberFormatException e ) {
+                throw new RuntimeDroolsException( "[Not After Evaluator]: Not possible to parse parameters: '" + parameters + "'",
+                                                  e );
+            }
+        }
+
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ArrayFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,471 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-import org.drools.util.ShadowProxyUtils;
-
-/**
- * For handling simple (non collection) array types.
- * @author Michael Neale
- */
-public class ArrayFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new ArrayFactory();
-
-    private ArrayFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( ArrayFactory.INSTANCE == null ) {
-            ArrayFactory.INSTANCE = new ArrayFactory();
-        }
-        return ArrayFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return ArrayEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return ArrayNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.CONTAINS ) {
-            return ArrayContainsEvaluator.INSTANCE;
-        } else if ( operator == Operator.EXCLUDES ) {
-            return ArrayExcludesEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_CONTAINS ) {
-            return ArrayExcludesEvaluator.INSTANCE; // 'not contains' and 'excludes' are synonyms
-        } else if ( operator == Operator.MEMBEROF ) {
-            return ArrayMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return ArrayNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for ArrayEvaluator" );
-        }
-    }
-
-    static class ArrayEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayEqualEvaluator();
-
-        private ArrayEqualEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory,
-                                                      object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory,
-                                                                              left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
-            }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( workingMemory,
-                                                             right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
-            }
-            return ((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory,
-                                                       object1 );
-            final Object value2 = extractor2.getValue( workingMemory,
-                                                       object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "Array ==";
-        }
-
-    }
-
-    static class ArrayNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayNotEqualEvaluator();
-
-        private ArrayNotEqualEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory,
-                                                      object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory,
-                                                                              left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right != null;
-            }
-            return !value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = context.extractor.getValue( workingMemory,
-                                                             right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value != null;
-            }
-            return !((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory,
-                                                       object1 );
-            final Object value2 = extractor2.getValue( workingMemory,
-                                                       object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "Array !=";
-        }
-    }
-
-    static class ArrayContainsEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayContainsEvaluator();
-
-        private ArrayContainsEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.CONTAINS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( workingMemory,
-                                                                  object1 );
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory,
-                                                                              left );
-            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
-                                                                          right );
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( workingMemory,
-                                                      object2 );
-            final Object[] array = (Object[]) extractor1.getValue( workingMemory,
-                                                                   object1 );
-
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public String toString() {
-            return "Array contains";
-        }
-    }
-
-    static class ArrayExcludesEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayExcludesEvaluator();
-
-        private ArrayExcludesEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.EXCLUDES );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object value = object2.getValue();
-            final Object[] array = (Object[]) extractor.getValue( workingMemory,
-                                                                  object1 );
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory,
-                                                                              left );
-            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object value = ((ObjectVariableContextEntry) context).left;
-            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
-                                                                          right );
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object value = extractor2.getValue( workingMemory,
-                                                      object2 );
-            final Object[] array = (Object[]) extractor1.getValue( workingMemory,
-                                                                   object1 );
-
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public String toString() {
-            return "Array excludes";
-        }
-    }
-
-    static class ArrayMemberOfEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayMemberOfEvaluator();
-
-        private ArrayMemberOfEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( workingMemory,
-                                                     object1 );
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory,
-                                                                                           left );
-            final Object value = ((ObjectVariableContextEntry) context).right;
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( workingMemory,
-                                                             right );
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
-                                                                   object2 );
-            final Object value = extractor1.getValue( workingMemory,
-                                                      object1 );
-
-            if ( array == null ) return false;
-            return ShadowProxyUtils.contains( array,
-                                              value );
-        }
-
-        public String toString() {
-            return "Array memberOf";
-        }
-    }
-
-    static class ArrayNotMemberOfEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ArrayNotMemberOfEvaluator();
-
-        private ArrayNotMemberOfEvaluator() {
-            super( ValueType.ARRAY_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1,
-                                final FieldValue object2) {
-            final Object[] array = (Object[]) object2.getValue();
-            final Object value = extractor.getValue( workingMemory,
-                                                     object1 );
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context,
-                                           final Object left) {
-            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory,
-                                                                                           left );
-            final Object value = ((ObjectVariableContextEntry) context).right;
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context,
-                                          final Object right) {
-            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
-            final Object value = context.extractor.getValue( workingMemory,
-                                                             right );
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2,
-                                final Object object2) {
-            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
-                                                                   object2 );
-            final Object value = extractor1.getValue( workingMemory,
-                                                      object1 );
-
-            if ( array == null ) return true;
-            return !ShadowProxyUtils.contains( array,
-                                               value );
-        }
-
-        public String toString() {
-            return "Array not memberOf";
-        }
-    }
-
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseMemberOfEvaluator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,86 +0,0 @@
-/**
- * 
- */
-package org.drools.base.evaluators;
-
-import java.util.Collection;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-import org.drools.util.ShadowProxyUtils;
-
-/**
- * This is a base class for MemberOf Evaluators
- * 
- * @author etirelli
- */
-public abstract class BaseMemberOfEvaluator extends BaseEvaluator {
-
-    public BaseMemberOfEvaluator(ValueType type,
-                                          Operator operator) {
-        super( type,
-               operator );
-    }
-
-    public boolean evaluate(InternalWorkingMemory workingMemory,
-                            final Extractor extractor,
-                            final Object object1, final FieldValue object2) {
-        if( object2.isNull() ) {
-            return false;
-        } else if( ! object2.isCollectionField() ) {
-            throw new ClassCastException("Can't check if an attribute is member of an object of class "+object2.getValue().getClass() );
-        }
-        final Collection col = (Collection) object2.getValue();
-        final Object value = extractor.getValue( workingMemory, object1 ); 
-        return ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                       final VariableContextEntry context, final Object left) {
-        final Object object = context.declaration.getExtractor().getValue( workingMemory, left );
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = ((ObjectVariableContextEntry) context).right;
-        return ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                      final VariableContextEntry context, final Object right) {
-        final Object object = ((ObjectVariableContextEntry) context).left;
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = context.extractor.getValue( workingMemory, right ); 
-        return ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluate(InternalWorkingMemory workingMemory,
-                            final Extractor extractor1,
-                            final Object object1,
-                            final Extractor extractor2, final Object object2) {
-        final Object object = extractor2.getValue( workingMemory, object2 );
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = extractor1.getValue( workingMemory, object1 );
-        return ShadowProxyUtils.contains( col, value );
-    }
-    
-    public abstract String toString();
-    
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BaseNotMemberOfEvaluator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,87 +0,0 @@
-/**
- * 
- */
-package org.drools.base.evaluators;
-
-import java.util.Collection;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-import org.drools.util.ShadowProxyUtils;
-
-/**
- * This is a base class for Not MemberOf Evaluators
- * 
- * @author etirelli
- *
- */
-public abstract class BaseNotMemberOfEvaluator extends BaseEvaluator {
-
-    public BaseNotMemberOfEvaluator(ValueType type,
-                                             Operator operator) {
-        super( type,
-               operator );
-    }
-
-    public boolean evaluate(InternalWorkingMemory workingMemory,
-                            final Extractor extractor,
-                            final Object object1, final FieldValue object2) {
-        if( object2.isNull() ) {
-            return false;
-        } else if( ! object2.isCollectionField() ) {
-            throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object2.getValue().getClass() );
-        }
-        final Collection col = (Collection) object2.getValue();
-        final Object value = extractor.getValue( workingMemory, object1 ); 
-        return ! ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                       final VariableContextEntry context, final Object left) {
-        final Object object = context.declaration.getExtractor().getValue( workingMemory, left );
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = ((ObjectVariableContextEntry) context).right;
-        return ! ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                      final VariableContextEntry context, final Object right) {
-        final Object object = ((ObjectVariableContextEntry) context).left;
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = context.extractor.getValue( workingMemory, right ); 
-        return ! ShadowProxyUtils.contains( col, value );
-    }
-
-    public boolean evaluate(InternalWorkingMemory workingMemory,
-                            final Extractor extractor1,
-                            final Object object1,
-                            final Extractor extractor2, final Object object2) {
-        final Object object = extractor2.getValue( workingMemory, object2 );
-        if( object == null ) {
-            return false;  
-        } else if( ! ( object instanceof Collection ) ) {
-            throw new ClassCastException("Can't check if an attribute is not member of an object of class "+object.getClass() );
-        }
-        final Collection col = (Collection) object;
-        final Object value = extractor1.getValue( workingMemory, object1 );
-        return ! ShadowProxyUtils.contains( col, value );
-    }
-
-    public abstract String toString();
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigDecimalFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,442 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.math.BigDecimal;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class BigDecimalFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new BigDecimalFactory();
-
-    private BigDecimalFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( BigDecimalFactory.INSTANCE == null ) {
-            BigDecimalFactory.INSTANCE = new BigDecimalFactory();
-        }
-        return BigDecimalFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return BigDecimalEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return BigDecimalNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return BigDecimalLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return BigDecimalLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return BigDecimalGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return BigDecimalGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return BigDecimalMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return BigDecimalNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for BigDecimalEvaluator" );
-        }
-    }
-
-    static class BigDecimalEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalEqualEvaluator();
-
-        private BigDecimalEqualEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
-            }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
-            }
-            return ((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "BigDecimal ==";
-        }
-
-    }
-
-    static class BigDecimalNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalNotEqualEvaluator();
-
-        private BigDecimalNotEqualEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right != null;
-            }
-            return !value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value != null;
-            }
-            return !((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "BigDecimal !=";
-        }
-    }
-
-    static class BigDecimalLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalLessEvaluator();
-
-        private BigDecimalLessEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) object2.getValue() ) < 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) < 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) < 0;
-        }
-
-        public String toString() {
-            return "BigDecimal <";
-        }
-    }
-
-    static class BigDecimalLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalLessOrEqualEvaluator();
-
-        private BigDecimalLessOrEqualEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) object2.getValue() ) <= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) <= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) <= 0;
-        }
-
-        public String toString() {
-            return "BigDecimal <=";
-        }
-    }
-
-    static class BigDecimalGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalGreaterEvaluator();
-
-        private BigDecimalGreaterEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) object2.getValue() ) > 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) > 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) > 0;
-        }
-
-        public String toString() {
-            return "BigDecimal >";
-        }
-    }
-
-    static class BigDecimalGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new BigDecimalGreaterOrEqualEvaluator();
-
-        private BigDecimalGreaterOrEqualEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) object2.getValue() ) >= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) >= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) >= 0;
-        }
-
-        public String toString() {
-            return "BigDecimal >=";
-        }
-    }
-
-    static class BigDecimalMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalMemberOfEvaluator();
-
-        private BigDecimalMemberOfEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "BigDecimal memberOf";
-        }
-    }
-
-    static class BigDecimalNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigDecimalNotMemberOfEvaluator();
-
-        private BigDecimalNotMemberOfEvaluator() {
-            super( ValueType.BIG_DECIMAL_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "BigDecimal not memberOf";
-        }
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BigIntegerFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,442 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.math.BigInteger;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class BigIntegerFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new BigIntegerFactory();
-
-    private BigIntegerFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( BigIntegerFactory.INSTANCE == null ) {
-            BigIntegerFactory.INSTANCE = new BigIntegerFactory();
-        }
-        return BigIntegerFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return BigIntegerEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return BigIntegerNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return BigIntegerLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return BigIntegerLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return BigIntegerGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return BigIntegerGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return BigIntegerMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return BigIntegerNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for BigIntegerEvaluator" );
-        }
-    }
-
-    static class BigIntegerEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerEqualEvaluator();
-
-        private BigIntegerEqualEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
-            }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
-            }
-            return ((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "BigInteger ==";
-        }
-    }
-
-    static class BigIntegerNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerNotEqualEvaluator();
-
-        private BigIntegerNotEqualEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right != null;
-            }
-            return !value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value != null;
-            }
-            return !((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "BigInteger !=";
-        }
-    }
-
-    static class BigIntegerLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerLessEvaluator();
-
-        private BigIntegerLessEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) object2.getValue() ) < 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) < 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) < 0;
-        }
-
-        public String toString() {
-            return "BigInteger <";
-        }
-    }
-
-    static class BigIntegerLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerLessOrEqualEvaluator();
-
-        private BigIntegerLessOrEqualEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) object2.getValue() ) <= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) <= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) <= 0;
-        }
-
-        public String toString() {
-            return "BigInteger <=";
-        }
-    }
-
-    static class BigIntegerGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerGreaterEvaluator();
-
-        private BigIntegerGreaterEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) object2.getValue() ) > 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) > 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) > 0;
-        }
-
-        public String toString() {
-            return "BigInteger >";
-        }
-    }
-
-    static class BigIntegerGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new BigIntegerGreaterOrEqualEvaluator();
-
-        private BigIntegerGreaterOrEqualEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) object2.getValue() ) >= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
-            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
-            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) >= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
-            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) >= 0;
-        }
-
-        public String toString() {
-            return "BigInteger >=";
-        }
-    }
-    
-    static class BigIntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerMemberOfEvaluator();
-
-        private BigIntegerMemberOfEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "BigInteger memberOf";
-        }
-    }
-
-    static class BigIntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BigIntegerNotMemberOfEvaluator();
-
-        private BigIntegerNotMemberOfEvaluator() {
-            super( ValueType.BIG_INTEGER_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "BigInteger not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BooleanFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,218 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class BooleanFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new BooleanFactory();
-
-    private BooleanFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( BooleanFactory.INSTANCE == null ) {
-            BooleanFactory.INSTANCE = new BooleanFactory();
-        }
-        return BooleanFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return BooleanEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return BooleanNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return BooleanMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return BooleanNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for BooleanEvaluator" );
-        }
-    }
-
-    static class BooleanEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new BooleanEqualEvaluator();
-
-        private BooleanEqualEvaluator() {
-            super( ValueType.PBOOLEAN_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getBooleanValue( workingMemory, object1 ) == object2.getBooleanValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) == ((BooleanVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object object2) {
-            if ( context.extractor.isNullValue( workingMemory, object2 )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return context.extractor.getBooleanValue( workingMemory, object2 ) == ((BooleanVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getBooleanValue( workingMemory, object1 ) == extractor2.getBooleanValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Boolean ==";
-        }
-
-    }
-
-    static class BooleanNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BooleanNotEqualEvaluator();
-
-        private BooleanNotEqualEvaluator() {
-            super( ValueType.PBOOLEAN_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getBooleanValue( workingMemory, object1 ) != object2.getBooleanValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) != ((BooleanVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object object2) {
-            if ( context.extractor.isNullValue( workingMemory, object2 )) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return context.extractor.getBooleanValue( workingMemory, object2 ) != ((BooleanVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getBooleanValue( workingMemory, object1 ) != extractor1.getBooleanValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Boolean !=";
-        }
-    }
-
-    static class BooleanMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BooleanMemberOfEvaluator();
-
-        private BooleanMemberOfEvaluator() {
-            super( ValueType.PBOOLEAN_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Boolean memberOf";
-        }
-    }
-
-    static class BooleanNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new BooleanNotMemberOfEvaluator();
-
-        private BooleanNotMemberOfEvaluator() {
-            super( ValueType.PBOOLEAN_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Boolean not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ByteFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,435 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class ByteFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new ByteFactory();
-
-    private ByteFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( ByteFactory.INSTANCE == null ) {
-            ByteFactory.INSTANCE = new ByteFactory();
-        }
-        return ByteFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return ByteEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return ByteNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return ByteLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return ByteLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return ByteGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return ByteGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return ByteMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return ByteNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for ByteEvaluator" );
-        }
-    }
-
-    static class ByteEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteEqualEvaluator();
-
-        private ByteEqualEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getByteValue( workingMemory, object1 ) == object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getByteValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getByteValue( workingMemory, object1 ) == extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte ==";
-        }
-
-    }
-
-    static class ByteNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteNotEqualEvaluator();
-
-        private ByteNotEqualEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getByteValue( workingMemory, object1 ) != object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            return context.declaration.getExtractor().getByteValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object object2) {
-            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( workingMemory, object2 );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getByteValue( workingMemory, object1 ) != extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte !=";
-        }
-    }
-
-    static class ByteLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteLessEvaluator();
-
-        private ByteLessEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getByteValue( workingMemory, object1 ) < object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getByteValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getByteValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getByteValue( workingMemory, object1 ) < extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte <";
-        }
-    }
-
-    static class ByteLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteLessOrEqualEvaluator();
-
-        private ByteLessOrEqualEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getByteValue( workingMemory, object1 ) <= object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getByteValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getByteValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getByteValue( workingMemory, object1 ) <= extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte <=";
-        }
-    }
-
-    static class ByteGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteGreaterEvaluator();
-
-        private ByteGreaterEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getByteValue( workingMemory, object1 ) > object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getByteValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getByteValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getByteValue( workingMemory, object1 ) > extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte >";
-        }
-    }
-
-    static class ByteGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new ByteGreaterOrEqualEvaluator();
-
-        private ByteGreaterOrEqualEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getByteValue( workingMemory, object1 ) >= object2.getByteValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getByteValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getByteValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getByteValue( workingMemory, object1 ) >= extractor2.getByteValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Byte >=";
-        }
-    }
-
-    static class ByteMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteMemberOfEvaluator();
-
-        private ByteMemberOfEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Byte memberOf";
-        }
-    }
-
-    static class ByteNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ByteNotMemberOfEvaluator();
-
-        private ByteNotMemberOfEvaluator() {
-            super( ValueType.PBYTE_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Byte not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CharacterFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,434 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.CharVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class CharacterFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new CharacterFactory();
-
-    private CharacterFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( CharacterFactory.INSTANCE == null ) {
-            CharacterFactory.INSTANCE = new CharacterFactory();
-        }
-        return CharacterFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return CharacterEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return CharacterNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return CharacterLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return CharacterLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return CharacterGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return CharacterGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return CharacterMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return CharacterNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for CharacterEvaluator" );
-        }
-    }
-
-    static class CharacterEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterEqualEvaluator();
-
-        private CharacterEqualEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getCharValue( workingMemory, object1 ) == object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((CharVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return ((CharVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getCharValue( workingMemory, object1 ) == extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character ==";
-        }
-    }
-
-    static class CharacterNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterNotEqualEvaluator();
-
-        private CharacterNotEqualEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getCharValue( workingMemory, object1 ) != object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((CharVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return ((CharVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getCharValue( workingMemory, object1 ) != extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character !=";
-        }
-    }
-
-    static class CharacterLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterLessEvaluator();
-
-        private CharacterLessEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getCharValue( workingMemory, object1 ) < object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((CharVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getCharValue( workingMemory, right ) < ((CharVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getCharValue( workingMemory, object1 ) < extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character <";
-        }
-    }
-
-    static class CharacterLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterLessOrEqualEvaluator();
-
-        private CharacterLessOrEqualEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getCharValue( workingMemory, object1 ) <= object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((CharVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getCharValue( workingMemory, right ) <= ((CharVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getCharValue( workingMemory, object1 ) <= extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character <=";
-        }
-    }
-
-    static class CharacterGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterGreaterEvaluator();
-
-        private CharacterGreaterEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getCharValue( workingMemory, object1 ) > object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((CharVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getCharValue( workingMemory, right ) > ((CharVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getCharValue( workingMemory, object1 ) > extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character >";
-        }
-    }
-
-    static class CharacterGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new CharacterGreaterOrEqualEvaluator();
-
-        private CharacterGreaterOrEqualEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getCharValue( workingMemory, object1 ) >= object2.getCharValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((CharVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getCharValue( workingMemory, right ) >= ((CharVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getCharValue( workingMemory, object1 ) >= extractor2.getCharValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Character >=";
-        }
-    }
-
-    static class CharacterMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterMemberOfEvaluator();
-
-        private CharacterMemberOfEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Character memberOf";
-        }
-    }
-
-    static class CharacterNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new CharacterNotMemberOfEvaluator();
-
-        private CharacterNotMemberOfEvaluator() {
-            super( ValueType.PCHAR_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Character not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,2632 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Comparator;
+import java.util.Date;
+
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ShadowProxy;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
+import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
+import org.drools.rule.VariableRestriction.LongVariableContextEntry;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+import org.drools.util.DateUtils;
+
+/**
+ * This class defines all the comparable built in 
+ * evaluators like >, >=, etc.
+ * 
+ * @author etirelli
+ */
+public class ComparableEvaluatorsDefinition implements EvaluatorDefinition {
+    
+    private static final String[] SUPPORTED_IDS = { Operator.LESS.getOperatorString(), Operator.LESS_OR_EQUAL.getOperatorString(),
+                                                    Operator.GREATER.getOperatorString(), Operator.GREATER_OR_EQUAL.getOperatorString() };
+    private EvaluatorCache evaluators = new EvaluatorCache() {
+        private static final long serialVersionUID = 4782368623L;
+        {
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.LESS,                BigDecimalLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.LESS_OR_EQUAL,       BigDecimalLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.GREATER,             BigDecimalGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.GREATER_OR_EQUAL,    BigDecimalGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.LESS,                BigIntegerLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.LESS_OR_EQUAL,       BigIntegerLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.GREATER,             BigIntegerGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.GREATER_OR_EQUAL,    BigIntegerGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.LESS,                ByteLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.LESS_OR_EQUAL,       ByteLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.GREATER,             ByteGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.GREATER_OR_EQUAL,    ByteGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.LESS,                ByteLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.LESS_OR_EQUAL,       ByteLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.GREATER,             ByteGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.GREATER_OR_EQUAL,    ByteGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.LESS,                CharacterLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.LESS_OR_EQUAL,       CharacterLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.GREATER,             CharacterGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.GREATER_OR_EQUAL,    CharacterGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.LESS,                CharacterLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.LESS_OR_EQUAL,       CharacterLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.GREATER,             CharacterGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.GREATER_OR_EQUAL,    CharacterGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.LESS,                DateLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.LESS_OR_EQUAL,       DateLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.GREATER,             DateGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.GREATER_OR_EQUAL,    DateGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.LESS,                DoubleLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.LESS_OR_EQUAL,       DoubleLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.GREATER,             DoubleGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.GREATER_OR_EQUAL,    DoubleGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.LESS,                DoubleLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.LESS_OR_EQUAL,       DoubleLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.GREATER,             DoubleGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.GREATER_OR_EQUAL,    DoubleGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.LESS,                FloatLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.LESS_OR_EQUAL,       FloatLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.GREATER,             FloatGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.GREATER_OR_EQUAL,    FloatGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.LESS,                FloatLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.LESS_OR_EQUAL,       FloatLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.GREATER,             FloatGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.GREATER_OR_EQUAL,    FloatGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.LESS,                IntegerLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.LESS_OR_EQUAL,       IntegerLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.GREATER,             IntegerGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.GREATER_OR_EQUAL,    IntegerGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.LESS,                IntegerLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.LESS_OR_EQUAL,       IntegerLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.GREATER,             IntegerGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.GREATER_OR_EQUAL,    IntegerGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.LESS,                LongLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.LESS_OR_EQUAL,       LongLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.GREATER,             LongGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.GREATER_OR_EQUAL,    LongGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.LESS,                LongLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.LESS_OR_EQUAL,       LongLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.GREATER,             LongGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.GREATER_OR_EQUAL,    LongGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.LESS,                ObjectLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.LESS_OR_EQUAL,       ObjectLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.GREATER,             ObjectGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.GREATER_OR_EQUAL,    ObjectGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.LESS,                ShortLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.LESS_OR_EQUAL,       ShortLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.GREATER,             ShortGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.GREATER_OR_EQUAL,    ShortGreaterOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.LESS,                ShortLessEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.LESS_OR_EQUAL,       ShortLessOrEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.GREATER,             ShortGreaterEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.GREATER_OR_EQUAL,    ShortGreaterOrEqualEvaluator.INSTANCE );
+        }
+    };
+    
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        return this.evaluators.getEvaluator( type, 
+                                             Operator.determineOperator( operatorId, 
+                                                                         isNegated ) );
+    }
+
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    public boolean isNegatable() {
+        return false;
+    }
+
+    public boolean operatesOnFactHandles() {
+        return false;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.supportsType( type );
+    }
+    
+    /*  *********************************************************
+     *           Evaluator Implementations
+     *  *********************************************************
+     */
+    static class BigDecimalLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalLessEvaluator();
+
+        private BigDecimalLessEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) object2.getValue() ) < 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) < 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) < 0;
+        }
+
+        public String toString() {
+            return "BigDecimal <";
+        }
+    }
+
+    static class BigDecimalLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalLessOrEqualEvaluator();
+
+        private BigDecimalLessOrEqualEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) <= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) <= 0;
+        }
+
+        public String toString() {
+            return "BigDecimal <=";
+        }
+    }
+
+    static class BigDecimalGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalGreaterEvaluator();
+
+        private BigDecimalGreaterEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) object2.getValue() ) > 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) > 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) > 0;
+        }
+
+        public String toString() {
+            return "BigDecimal >";
+        }
+    }
+
+    static class BigDecimalGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new BigDecimalGreaterOrEqualEvaluator();
+
+        private BigDecimalGreaterOrEqualEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigDecimal) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigDecimal) ((ObjectVariableContextEntry) context).left ) >= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigDecimal comp = (BigDecimal) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigDecimal) extractor2.getValue( workingMemory, object2 ) ) >= 0;
+        }
+
+        public String toString() {
+            return "BigDecimal >=";
+        }
+    }
+
+    static class BigIntegerLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerLessEvaluator();
+
+        private BigIntegerLessEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) object2.getValue() ) < 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) < 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) < 0;
+        }
+
+        public String toString() {
+            return "BigInteger <";
+        }
+    }
+
+    static class BigIntegerLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerLessOrEqualEvaluator();
+
+        private BigIntegerLessOrEqualEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) <= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) <= 0;
+        }
+
+        public String toString() {
+            return "BigInteger <=";
+        }
+    }
+
+    static class BigIntegerGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerGreaterEvaluator();
+
+        private BigIntegerGreaterEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) object2.getValue() ) > 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) > 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) > 0;
+        }
+
+        public String toString() {
+            return "BigInteger >";
+        }
+    }
+
+    static class BigIntegerGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new BigIntegerGreaterOrEqualEvaluator();
+
+        private BigIntegerGreaterOrEqualEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) ((ObjectVariableContextEntry) context).right;
+            return comp.compareTo( (BigInteger) context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) context.extractor.getValue( workingMemory, right );
+            return comp.compareTo( (BigInteger) ((ObjectVariableContextEntry) context).left ) >= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final BigInteger comp = (BigInteger) extractor1.getValue( workingMemory, object1 );
+            return comp.compareTo( (BigInteger) extractor2.getValue( workingMemory, object2 ) ) >= 0;
+        }
+
+        public String toString() {
+            return "BigInteger >=";
+        }
+    }
+    
+    static class ByteLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteLessEvaluator();
+
+        private ByteLessEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getByteValue( workingMemory, object1 ) < object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getByteValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getByteValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getByteValue( workingMemory, object1 ) < extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte <";
+        }
+    }
+
+    static class ByteLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteLessOrEqualEvaluator();
+
+        private ByteLessOrEqualEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getByteValue( workingMemory, object1 ) <= object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getByteValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getByteValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getByteValue( workingMemory, object1 ) <= extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte <=";
+        }
+    }
+
+    static class ByteGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteGreaterEvaluator();
+
+        private ByteGreaterEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getByteValue( workingMemory, object1 ) > object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getByteValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getByteValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getByteValue( workingMemory, object1 ) > extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte >";
+        }
+    }
+
+    static class ByteGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new ByteGreaterOrEqualEvaluator();
+
+        private ByteGreaterOrEqualEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getByteValue( workingMemory, object1 ) >= object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getByteValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getByteValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getByteValue( workingMemory, object1 ) >= extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte >=";
+        }
+    }
+
+    static class CharacterLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterLessEvaluator();
+
+        private CharacterLessEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getCharValue( workingMemory, object1 ) < object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((CharVariableContextEntry) context).right < context.declaration.getExtractor().getCharValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getCharValue( workingMemory, right ) < ((CharVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getCharValue( workingMemory, object1 ) < extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character <";
+        }
+    }
+
+    static class CharacterLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterLessOrEqualEvaluator();
+
+        private CharacterLessOrEqualEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getCharValue( workingMemory, object1 ) <= object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((CharVariableContextEntry) context).right <= context.declaration.getExtractor().getCharValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getCharValue( workingMemory, right ) <= ((CharVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getCharValue( workingMemory, object1 ) <= extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character <=";
+        }
+    }
+
+    static class CharacterGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterGreaterEvaluator();
+
+        private CharacterGreaterEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getCharValue( workingMemory, object1 ) > object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((CharVariableContextEntry) context).right > context.declaration.getExtractor().getCharValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getCharValue( workingMemory, right ) > ((CharVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getCharValue( workingMemory, object1 ) > extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character >";
+        }
+    }
+
+    static class CharacterGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new CharacterGreaterOrEqualEvaluator();
+
+        private CharacterGreaterOrEqualEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getCharValue( workingMemory, object1 ) >= object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((CharVariableContextEntry) context).right >= context.declaration.getExtractor().getCharValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getCharValue( workingMemory, right ) >= ((CharVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getCharValue( workingMemory, object1 ) >= extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character >=";
+        }
+    }
+
+    static class DateLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateLessEvaluator();
+
+        private DateLessEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) < 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) < 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            return value1.compareTo( value2 ) < 0;
+        }
+
+        public String toString() {
+            return "Date <";
+        }
+    }
+
+    static class DateLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateLessOrEqualEvaluator();
+
+        private DateLessOrEqualEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) <= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) <= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            return value1.compareTo( value2 ) <= 0;
+        }
+
+        public String toString() {
+            return "Date <=";
+        }
+    }
+
+    static class DateGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateGreaterEvaluator();
+
+        private DateGreaterEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) > 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) > 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            return value1.compareTo( value2 ) > 0;
+        }
+
+        public String toString() {
+            return "Date >";
+        }
+    }
+
+    static class DateGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new DateGreaterOrEqualEvaluator();
+
+        private DateGreaterOrEqualEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) >= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            return DateUtils.getRightDate( value2 ).compareTo( value1 ) >= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            return value1.compareTo( value2 ) >= 0;
+        }
+
+        public String toString() {
+            return "Date >=";
+        }
+    }
+
+    static class DoubleLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleLessEvaluator();
+
+        private DoubleLessEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) < object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getDoubleValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getDoubleValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) < extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double <";
+        }
+    }
+
+    static class DoubleLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleLessOrEqualEvaluator();
+
+        private DoubleLessOrEqualEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) <= object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getDoubleValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) <= extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double <=";
+        }
+    }
+
+    static class DoubleGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleGreaterEvaluator();
+
+        private DoubleGreaterEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) > object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getDoubleValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getDoubleValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) > extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double >";
+        }
+    }
+
+    static class DoubleGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new DoubleGreaterOrEqualEvaluator();
+
+        private DoubleGreaterOrEqualEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) >= object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getDoubleValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) >= extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double >=";
+        }
+    }
+    
+    static class FloatLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatLessEvaluator();
+
+        private FloatLessEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) < object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getFloatValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getFloatValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) < extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float <";
+        }
+    }
+
+    static class FloatLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatLessOrEqualEvaluator();
+
+        private FloatLessOrEqualEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) <= object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getFloatValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getFloatValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) <= extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float <=";
+        }
+    }
+
+    static class FloatGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatGreaterEvaluator();
+
+        private FloatGreaterEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) > object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getFloatValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getFloatValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) > extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float >";
+        }
+    }
+
+    static class FloatGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new FloatGreaterOrEqualEvaluator();
+
+        private FloatGreaterOrEqualEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) >= object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getFloatValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.extractor.getFloatValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) >= extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float >=";
+        }
+    }
+    
+    static class IntegerLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerLessEvaluator();
+
+        private IntegerLessEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getIntValue( workingMemory, object1 ) < object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getIntValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getIntValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getIntValue( workingMemory, object1 ) < extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer <";
+        }
+    }
+
+    static class IntegerLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerLessOrEqualEvaluator();
+
+        private IntegerLessOrEqualEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getIntValue( workingMemory, object1 ) <= object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getIntValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getIntValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getIntValue( workingMemory, object1 ) <= extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer <=";
+        }
+    }
+
+    static class IntegerGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerGreaterEvaluator();
+
+        private IntegerGreaterEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getIntValue( workingMemory, object1 ) > object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getIntValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getIntValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getIntValue( workingMemory, object1 ) > extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer >";
+        }
+    }
+
+    static class IntegerGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new IntegerGreaterOrEqualEvaluator();
+
+        private IntegerGreaterOrEqualEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getIntValue( workingMemory, object1 ) >= object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getIntValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getIntValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getIntValue( workingMemory, object1 ) >= extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer >=";
+        }
+    }
+    
+    static class LongLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongLessEvaluator();
+
+        private LongLessEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getLongValue( workingMemory, object1 ) < object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getLongValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getLongValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getLongValue( workingMemory, object1 ) < extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long <";
+        }
+    }
+
+    static class LongLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongLessOrEqualEvaluator();
+
+        private LongLessOrEqualEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getLongValue( workingMemory, object1 ) <= object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getLongValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getLongValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getLongValue( workingMemory, object1 ) <= extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long <=";
+        }
+    }
+
+    static class LongGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongGreaterEvaluator();
+
+        private LongGreaterEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getLongValue( workingMemory, object1 ) > object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getLongValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getLongValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getLongValue( workingMemory, object1 ) > extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long >";
+        }
+    }
+
+    static class LongGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new LongGreaterOrEqualEvaluator();
+
+        private LongGreaterOrEqualEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getLongValue( workingMemory, object1 ) >= object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getLongValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getLongValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getLongValue( workingMemory, object1 ) >= extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long >=";
+        }
+    }
+    
+    static class ObjectLessEvaluator extends BaseEvaluator {
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectLessEvaluator();
+        private static final ObjectComparator comparator = new ObjectComparator();
+        
+
+        private ObjectLessEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
+            return comparator.compare( comp, object2.getValue() ) < 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
+            return comparator.compare( comp,  context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
+            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) < 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) < 0;
+        }
+
+        public String toString() {
+            return "Object <";
+        }
+    }
+
+    static class ObjectLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectLessOrEqualEvaluator();
+        private static final ObjectComparator comparator = new ObjectComparator();
+
+        private ObjectLessOrEqualEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
+            return comparator.compare( comp, object2.getValue() ) <= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
+            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
+            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) <= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) <= 0;
+        }
+
+        public String toString() {
+            return "Object <=";
+        }
+    }
+
+    static class ObjectGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectGreaterEvaluator();
+        private static final ObjectComparator comparator = new ObjectComparator();
+
+        private ObjectGreaterEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
+            return comparator.compare( comp, object2.getValue() ) > 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
+            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
+            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) > 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) > 0;
+        }
+
+        public String toString() {
+            return "Object >";
+        }
+    }
+
+    static class ObjectGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectGreaterOrEqualEvaluator();
+        private static final ObjectComparator comparator = new ObjectComparator();
+
+        private ObjectGreaterOrEqualEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
+            return comparator.compare( comp, object2.getValue() ) >= 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
+            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
+            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) >= 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
+            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) >= 0;
+        }
+
+        public String toString() {
+            return "Object >=";
+        }
+    }
+
+    static class ShortLessEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortLessEvaluator();
+
+        private ShortLessEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.LESS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getShortValue( workingMemory, object1 ) < object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getShortValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getShortValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getShortValue( workingMemory, object1 ) < extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Short <";
+        }
+    }
+
+    static class ShortLessOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortLessOrEqualEvaluator();
+
+        private ShortLessOrEqualEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.LESS_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getShortValue( workingMemory, object1 ) <= object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getShortValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getShortValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getShortValue( workingMemory, object1 ) <= extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Boolean <=";
+        }
+    }
+
+    static class ShortGreaterEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortGreaterEvaluator();
+
+        private ShortGreaterEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.GREATER );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getShortValue( workingMemory, object1 ) > object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getShortValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getShortValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getShortValue( workingMemory, object1 ) > extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Short >";
+        }
+    }
+
+    static class ShortGreaterOrEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortGreaterOrEqualEvaluator();
+
+        private ShortGreaterOrEqualEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.GREATER_OR_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if( extractor.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor.getShortValue( workingMemory, object1 ) >= object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if( context.rightNull ) {
+                return false;
+            }
+            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getShortValue( workingMemory, left );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if( context.extractor.isNullValue( workingMemory, right ) ) {
+                return false;
+            }
+            return context.extractor.getShortValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if( extractor1.isNullValue( workingMemory, object1 ) ) {
+                return false;
+            }
+            return extractor1.getShortValue( workingMemory, object1 ) >= extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Short >=";
+        }
+    }
+
+    
+    protected static class ObjectComparator implements Comparator {
+        // this is a stateless object, and so, can be shared among threads
+        // PLEASE: do not add state to it, unless you remove all concurrent 
+        // calls to this class instances
+
+        public int compare(Object arg0,
+                           Object arg1) {
+            if( arg0 instanceof Double || arg0 instanceof Float ) {
+                double val0 = ((Number) arg0).doubleValue();
+                double val1 = 0;
+                if( arg1 instanceof Number ) {
+                    val1 = ((Number) arg1).doubleValue();
+                } else if( arg1 instanceof String ) {
+                    val1 = Double.parseDouble( ( String ) arg1 );
+                } else {
+                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
+                }
+                return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
+            } else if( arg0 instanceof Number ){
+                long val0 = ((Number) arg0).longValue();
+                long val1 = 0;
+                if( arg1 instanceof Number ) {
+                    val1 = ((Number) arg1).longValue();
+                } else if( arg1 instanceof String ) {
+                    val1 = Long.parseLong( ( String ) arg1 ); 
+                } else {
+                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a long value to compare it to "+arg0.getClass() );
+                }
+                return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
+            } else if( arg0 instanceof String ) {
+                try {
+                    double val0 = Double.parseDouble( (String) arg0 );
+                    double val1 = 0;
+                    if( arg1 instanceof Number ) {
+                        val1 = ((Number) arg1).doubleValue();
+                    } else if( arg1 instanceof String ) {
+                        val1 = Double.parseDouble( ( String ) arg1 );
+                    } else {
+                        throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
+                    }
+                    return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
+                } catch( NumberFormatException nfe ) {
+                    return ( (String) arg0).compareTo( arg1.toString() );
+                }
+                
+            }
+            try {
+                return ((Comparable)arg0).compareTo( arg1 );
+            } catch ( ClassCastException cce ) {
+                throw new ClassCastException( "Not possible to compare a "+arg0.getClass()+" with a "+arg1.getClass());
+            }
+        }
+    }
+    
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,535 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-/**
- * This will generate evaluators that handle dates.
- * This will also parse strings into dates, according to 
- * DEFAULT_FORMAT_MASK, unless it is overridden by the drools.dateformat system property.
- * 
- * When parsing dates from a string, no time is included.
- * 
- * So you can do expressions like 
- * <code>Person(birthday <= "10-Jul-1974")</code> etc.
- * 
- * @author Michael Neale
- */
-public class DateFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID    = 400L;
-    private static final String     DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
-    private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
-
-    private static EvaluatorFactory INSTANCE            = new DateFactory();
-    private static SimpleDateFormat df;
-
-    private DateFactory() {
-        df = new SimpleDateFormat( DateFactory.DATE_FORMAT_MASK );
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( DateFactory.INSTANCE == null ) {
-            DateFactory.INSTANCE = new DateFactory();
-        }
-        return DateFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return DateEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return DateNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return DateLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return DateLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return DateGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return DateGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return DateMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return DateNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for DateEvaluator" );
-        }
-    }
-
-    static class DateEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateEqualEvaluator();
-
-        private DateEqualEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            if ( value2 == null ) {
-                return false;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) == 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            if ( value2 == null ) {
-                return false;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) == 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            if ( value2 == null ) {
-                return false;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) == 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            if ( value2 == null ) {
-                return false;
-            }
-            return value1.compareTo( value2 ) == 0;
-        }
-
-        public String toString() {
-            return "Date ==";
-        }
-
-    }
-
-    static class DateNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateNotEqualEvaluator();
-
-        private DateNotEqualEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            if ( value2 == null ) {
-                return true;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) != 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            if ( value2 == null ) {
-                return true;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) != 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            if ( value2 == null ) {
-                return true;
-            }
-            return value1.compareTo( getRightDate( value2 ) ) != 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            if ( value2 == null ) {
-                return true;
-            }
-            return value1.compareTo( value2 ) != 0;
-        }
-
-        public String toString() {
-            return "Date !=";
-        }
-    }
-
-    static class DateLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateLessEvaluator();
-
-        private DateLessEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return value1.compareTo( getRightDate( value2 ) ) < 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return getRightDate( value2 ).compareTo( value1 ) < 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            return getRightDate( value2 ).compareTo( value1 ) < 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            return value1.compareTo( value2 ) < 0;
-        }
-
-        public String toString() {
-            return "Date <";
-        }
-    }
-
-    static class DateLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateLessOrEqualEvaluator();
-
-        private DateLessOrEqualEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return value1.compareTo( getRightDate( value2 ) ) <= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return getRightDate( value2 ).compareTo( value1 ) <= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            return getRightDate( value2 ).compareTo( value1 ) <= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            return value1.compareTo( value2 ) <= 0;
-        }
-
-        public String toString() {
-            return "Date <=";
-        }
-    }
-
-    static class DateGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateGreaterEvaluator();
-
-        private DateGreaterEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return value1.compareTo( getRightDate( value2 ) ) > 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return getRightDate( value2 ).compareTo( value1 ) > 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            return getRightDate( value2 ).compareTo( value1 ) > 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            return value1.compareTo( value2 ) > 0;
-        }
-
-        public String toString() {
-            return "Date >";
-        }
-    }
-
-    static class DateGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new DateGreaterOrEqualEvaluator();
-
-        private DateGreaterOrEqualEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return value1.compareTo( getRightDate( value2 ) ) >= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return getRightDate( value2 ).compareTo( value1 ) >= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
-            final Object value2 = context.extractor.getValue( workingMemory, right );
-            return getRightDate( value2 ).compareTo( value1 ) >= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
-            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
-            return value1.compareTo( value2 ) >= 0;
-        }
-
-        public String toString() {
-            return "Date >=";
-        }
-    }
-
-    static class DateMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateMemberOfEvaluator();
-
-        private DateMemberOfEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Date memberOf";
-        }
-    }
-
-    static class DateNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DateNotMemberOfEvaluator();
-
-        private DateNotMemberOfEvaluator() {
-            super( ValueType.DATE_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Date not memberOf";
-        }
-    }
-    
-    /** Use the simple date formatter to read the date from a string */
-    public static Date parseDate(final String input) {
-        try {
-            return df.parse( input );
-        } catch ( final ParseException e ) {
-            throw new IllegalArgumentException( "Invalid date input format: [" + input + "] it should follow: [" + DateFactory.DATE_FORMAT_MASK + "]" );
-        }
-    }
-
-    /** Converts the right hand side date as appropriate */
-    private static Date getRightDate(final Object object2) {
-        if ( object2 == null ) {
-            return null;
-        }
-        if ( object2 instanceof String ) {
-            return parseDate( (String) object2 );
-        } else if ( object2 instanceof Date ) {
-            return (Date) object2;
-        } else {
-            throw new IllegalArgumentException( "Unable to convert " + object2.getClass() + " to a Date." );
-        }
-    }
-
-    /** Check for the system property override, if it exists */
-    private static String getDateFormatMask() {
-        String fmt = System.getProperty( "drools.dateformat" );
-        if ( fmt == null ) {
-            fmt = DateFactory.DEFAULT_FORMAT_MASK;
-        }
-        return fmt;
-    }
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DoubleFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,456 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class DoubleFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new DoubleFactory();
-
-    private DoubleFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( DoubleFactory.INSTANCE == null ) {
-            DoubleFactory.INSTANCE = new DoubleFactory();
-        }
-        return DoubleFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return DoubleEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return DoubleNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return DoubleLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return DoubleLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return DoubleGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return DoubleGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return DoubleMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return DoubleNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for DoubleEvaluator" );
-        }
-    }
-
-    static class DoubleEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleEqualEvaluator();
-
-        private DoubleEqualEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) == object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) == extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double ==";
-        }
-    }
-
-    static class DoubleNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleNotEqualEvaluator();
-
-        private DoubleNotEqualEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) != object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) != extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double !=";
-        }
-    }
-
-    static class DoubleLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleLessEvaluator();
-
-        private DoubleLessEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) < object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getDoubleValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) < extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double <";
-        }
-    }
-
-    static class DoubleLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleLessOrEqualEvaluator();
-
-        private DoubleLessOrEqualEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) <= object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) <= extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double <=";
-        }
-    }
-
-    static class DoubleGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleGreaterEvaluator();
-
-        private DoubleGreaterEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) > object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getDoubleValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) > extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double >";
-        }
-    }
-
-    static class DoubleGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new DoubleGreaterOrEqualEvaluator();
-
-        private DoubleGreaterOrEqualEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getDoubleValue( workingMemory, object1 ) >= object2.getDoubleValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getDoubleValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getDoubleValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getDoubleValue( workingMemory, object1 ) >= extractor2.getDoubleValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Double >=";
-        }
-    }
-    
-    static class DoubleMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleMemberOfEvaluator();
-
-        private DoubleMemberOfEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Double memberOf";
-        }
-    }
-
-    static class DoubleNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new DoubleNotMemberOfEvaluator();
-
-        private DoubleNotMemberOfEvaluator() {
-            super( ValueType.PDOUBLE_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Double not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,2110 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.util.Date;
+
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ShadowProxy;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
+import org.drools.rule.VariableRestriction.CharVariableContextEntry;
+import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
+import org.drools.rule.VariableRestriction.LongVariableContextEntry;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+import org.drools.util.DateUtils;
+
+/**
+ * This class defines the default built in equality
+ * evaluators == and !=
+ * 
+ * @author etirelli
+ */
+public class EqualityEvaluatorsDefinition implements EvaluatorDefinition {
+    
+    private static final String[] SUPPORTED_IDS = { Operator.EQUAL.getOperatorString(), Operator.NOT_EQUAL.getOperatorString() };
+    private EvaluatorCache evaluators = new EvaluatorCache() {
+        private static final long serialVersionUID = 4782368623L;
+        {
+            addEvaluator( ValueType.ARRAY_TYPE,         Operator.EQUAL,         ArrayEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,         Operator.NOT_EQUAL,     ArrayNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.EQUAL,         BigDecimalEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,   Operator.NOT_EQUAL,     BigDecimalNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.EQUAL,         BigIntegerEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,   Operator.NOT_EQUAL,     BigIntegerNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BOOLEAN_TYPE,       Operator.EQUAL,         BooleanEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BOOLEAN_TYPE,       Operator.NOT_EQUAL,     BooleanNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBOOLEAN_TYPE,      Operator.EQUAL,         BooleanEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBOOLEAN_TYPE,      Operator.NOT_EQUAL,     BooleanNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.EQUAL,         ByteEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,          Operator.NOT_EQUAL,     ByteNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.EQUAL,         ByteEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,         Operator.NOT_EQUAL,     ByteNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.EQUAL,         CharacterEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,          Operator.NOT_EQUAL,     CharacterNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.EQUAL,         CharacterEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,         Operator.NOT_EQUAL,     CharacterNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.EQUAL,         DateEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,          Operator.NOT_EQUAL,     DateNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.EQUAL,         DoubleEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,        Operator.NOT_EQUAL,     DoubleNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.EQUAL,         DoubleEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,       Operator.NOT_EQUAL,     DoubleNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FACTTEMPLATE_TYPE,  Operator.EQUAL,         FactTemplateEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FACTTEMPLATE_TYPE,  Operator.NOT_EQUAL,     FactTemplateNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.EQUAL,         FloatEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,         Operator.NOT_EQUAL,     FloatNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.EQUAL,         FloatEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,        Operator.NOT_EQUAL,     FloatNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.EQUAL,         IntegerEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,       Operator.NOT_EQUAL,     IntegerNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.EQUAL,         IntegerEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,      Operator.NOT_EQUAL,     IntegerNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.EQUAL,         LongEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,          Operator.NOT_EQUAL,     LongNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.EQUAL,         LongEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,         Operator.NOT_EQUAL,     LongNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.EQUAL,         ObjectEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,        Operator.NOT_EQUAL,     ObjectNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.EQUAL,         ShortEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,         Operator.NOT_EQUAL,     ShortNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.EQUAL,         ShortEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,        Operator.NOT_EQUAL,     ShortNotEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,        Operator.EQUAL,         StringEqualEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,        Operator.NOT_EQUAL,     StringNotEqualEvaluator.INSTANCE );
+        }
+    };
+    
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        return this.evaluators.getEvaluator( type, Operator.determineOperator( operatorId, isNegated ) );
+    }
+
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    public boolean isNegatable() {
+        return false;
+    }
+
+    public boolean operatesOnFactHandles() {
+        return false;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.supportsType( type );
+    }
+    
+    /*  *********************************************************
+     *           Evaluator Implementations
+     *  *********************************************************
+     */
+    
+    static class ArrayEqualEvaluator extends BaseEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayEqualEvaluator();
+
+        private ArrayEqualEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory,
+                                                      object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory,
+                                                       object1 );
+            final Object value2 = extractor2.getValue( workingMemory,
+                                                       object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "Array ==";
+        }
+
+    }
+
+    static class ArrayNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayNotEqualEvaluator();
+
+        private ArrayNotEqualEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory,
+                                                      object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory,
+                                                       object1 );
+            final Object value2 = extractor2.getValue( workingMemory,
+                                                       object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "Array !=";
+        }
+    }
+
+    static class BigDecimalEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalEqualEvaluator();
+
+        private BigDecimalEqualEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "BigDecimal ==";
+        }
+
+    }
+
+    static class BigDecimalNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalNotEqualEvaluator();
+
+        private BigDecimalNotEqualEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "BigDecimal !=";
+        }
+    }
+
+    static class BigIntegerEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerEqualEvaluator();
+
+        private BigIntegerEqualEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "BigInteger ==";
+        }
+    }
+
+    static class BigIntegerNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerNotEqualEvaluator();
+
+        private BigIntegerNotEqualEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "BigInteger !=";
+        }
+    }
+
+    static class BooleanEqualEvaluator extends BaseEvaluator {
+
+        private static final long      serialVersionUID = 400L;
+        private final static Evaluator INSTANCE         = new BooleanEqualEvaluator();
+
+        private BooleanEqualEvaluator() {
+            super( ValueType.PBOOLEAN_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getBooleanValue( workingMemory, object1 ) == object2.getBooleanValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) == ((BooleanVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return context.extractor.getBooleanValue( workingMemory, object2 ) == ((BooleanVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getBooleanValue( workingMemory, object1 ) == extractor2.getBooleanValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Boolean ==";
+        }
+
+    }
+
+    static class BooleanNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BooleanNotEqualEvaluator();
+
+        private BooleanNotEqualEvaluator() {
+            super( ValueType.PBOOLEAN_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getBooleanValue( workingMemory, object1 ) != object2.getBooleanValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            return context.declaration.getExtractor().getBooleanValue( workingMemory, left ) != ((BooleanVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return context.extractor.getBooleanValue( workingMemory, object2 ) != ((BooleanVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getBooleanValue( workingMemory, object1 ) != extractor1.getBooleanValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Boolean !=";
+        }
+    }
+
+    static class ByteEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteEqualEvaluator();
+
+        private ByteEqualEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getByteValue( workingMemory, object1 ) == object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getByteValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return ((LongVariableContextEntry) context).left == context.extractor.getByteValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getByteValue( workingMemory, object1 ) == extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte ==";
+        }
+
+    }
+
+    static class ByteNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteNotEqualEvaluator();
+
+        private ByteNotEqualEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getByteValue( workingMemory, object1 ) != object2.getByteValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            return context.declaration.getExtractor().getByteValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return ((LongVariableContextEntry) context).left != context.extractor.getByteValue( workingMemory, object2 );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getByteValue( workingMemory, object1 ) != extractor2.getByteValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Byte !=";
+        }
+    }
+
+    static class CharacterEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterEqualEvaluator();
+
+        private CharacterEqualEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getCharValue( workingMemory, object1 ) == object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) == ((CharVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return ((CharVariableContextEntry) context).left == context.extractor.getCharValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getCharValue( workingMemory, object1 ) == extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character ==";
+        }
+    }
+
+    static class CharacterNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterNotEqualEvaluator();
+
+        private CharacterNotEqualEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getCharValue( workingMemory, object1 ) != object2.getCharValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            return context.declaration.getExtractor().getCharValue( workingMemory, left ) != ((CharVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return ((CharVariableContextEntry) context).left != context.extractor.getCharValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getCharValue( workingMemory, object1 ) != extractor2.getCharValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Character !=";
+        }
+    }
+
+    static class DateEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateEqualEvaluator();
+
+        private DateEqualEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) == 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) == 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) == 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if ( value2 == null ) {
+                return false;
+            }
+            return value1.compareTo( value2 ) == 0;
+        }
+
+        public String toString() {
+            return "Date ==";
+        }
+
+    }
+
+    static class DateNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateNotEqualEvaluator();
+
+        private DateNotEqualEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) != 0;
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Date value1 = (Date) context.declaration.getExtractor().getValue( workingMemory, left );
+            final Object value2 = ((ObjectVariableContextEntry) context).right;
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) != 0;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Date value1 = (Date) ((ObjectVariableContextEntry) context).left;
+            final Object value2 = context.extractor.getValue( workingMemory, right );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( DateUtils.getRightDate( value2 ) ) != 0;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
+            final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if ( value2 == null ) {
+                return true;
+            }
+            return value1.compareTo( value2 ) != 0;
+        }
+
+        public String toString() {
+            return "Date !=";
+        }
+    }
+
+    static class DoubleEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleEqualEvaluator();
+
+        private DoubleEqualEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) == object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getDoubleValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) == extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double ==";
+        }
+    }
+
+    static class DoubleNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleNotEqualEvaluator();
+
+        private DoubleNotEqualEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getDoubleValue( workingMemory, object1 ) != object2.getDoubleValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getDoubleValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getDoubleValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getDoubleValue( workingMemory, object1 ) != extractor2.getDoubleValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Double !=";
+        }
+    }
+
+    static class FactTemplateEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FactTemplateEqualEvaluator();
+
+        private FactTemplateEqualEvaluator() {
+            super( ValueType.FACTTEMPLATE_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "FactTemplate ==";
+        }
+
+    }
+
+    static class FactTemplateNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FactTemplateNotEqualEvaluator();
+
+        private FactTemplateNotEqualEvaluator() {
+            super( ValueType.FACTTEMPLATE_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "FactTemplate !=";
+        }
+    }
+    
+    static class FloatEqualEvaluator extends BaseEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatEqualEvaluator();
+
+        private FloatEqualEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) == object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) == extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float ==";
+        }
+    }
+
+    static class FloatNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatNotEqualEvaluator();
+
+        private FloatNotEqualEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor.getFloatValue( workingMemory, object1 ) != object2.getFloatValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            // TODO: we are not handling delta right now... maybe we should
+            return extractor1.getFloatValue( workingMemory, object1 ) != extractor2.getFloatValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Float !=";
+        }
+    }
+
+    static class IntegerEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerEqualEvaluator();
+
+        private IntegerEqualEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getIntValue( workingMemory, object1 ) == object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getIntValue( workingMemory, left ) == ((LongVariableContextEntry) context).right; 
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return context.extractor.getIntValue( workingMemory, object2 ) == ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {            
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getIntValue( workingMemory, object1 ) == extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer ==";
+        }
+
+    }
+
+    static class IntegerNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerNotEqualEvaluator();
+
+        private IntegerNotEqualEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {                     
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getIntValue( workingMemory, object1 ) != object2.getIntValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            return context.declaration.getExtractor().getIntValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object object2) {
+            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return context.extractor.getIntValue( workingMemory, object2 ) != ((LongVariableContextEntry) context).left;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getIntValue( workingMemory, object1 ) != extractor2.getIntValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Integer !=";
+        }
+    }
+
+    static class LongEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongEqualEvaluator();
+
+        private LongEqualEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getLongValue( workingMemory, object1 ) == object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getLongValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getLongValue( workingMemory, object1 ) == extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long ==";
+        }
+    }
+
+    static class LongNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongNotEqualEvaluator();
+
+        private LongNotEqualEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getLongValue( workingMemory, object1 ) != object2.getLongValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            return context.declaration.getExtractor().getLongValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getLongValue( workingMemory, object1 ) != extractor2.getLongValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Long !=";
+        }
+    }
+
+    static class ObjectEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectEqualEvaluator();
+        private static final ObjectEqualsComparator comparator = new ObjectEqualsComparator();   
+        
+        private ObjectEqualEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if( value2 != null && value2 instanceof ShadowProxy ) {
+                return comparator.equals( value2, value1 );
+            }
+            return comparator.equals( value1, value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            if( ((ObjectVariableContextEntry) context).right != null && ((ObjectVariableContextEntry) context).right instanceof ShadowProxy ) {
+                return comparator.equals( ((ObjectVariableContextEntry) context).right,  value );
+            }
+            return comparator.equals( value, ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            if( value != null && value instanceof ShadowProxy ) {
+                return comparator.equals( value, ((ObjectVariableContextEntry) context).left );
+            }
+            return comparator.equals( ((ObjectVariableContextEntry) context).left, value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            if( value2 != null && value2 instanceof ShadowProxy ) {
+                return comparator.equals( value2, value1 );
+            }
+            return comparator.equals( value1, value2 );
+        }
+
+        public String toString() {
+            return "Object ==";
+        }
+
+    }
+
+    static class ObjectNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectNotEqualEvaluator();
+        private static final ObjectEqualsComparator comparator = new ObjectEqualsComparator();           
+
+        private ObjectNotEqualEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if( value2 != null && value2 instanceof ShadowProxy ) {
+                return !comparator.equals( value2, value1 );
+            }
+            return !comparator.equals( value1, value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            if( ((ObjectVariableContextEntry) context).right != null && ((ObjectVariableContextEntry) context).right instanceof ShadowProxy ) {
+                return !comparator.equals( ((ObjectVariableContextEntry) context).right, value );
+            }
+            return !comparator.equals( value, ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            if( value != null && value instanceof ShadowProxy ) {
+                return !comparator.equals( value, ((ObjectVariableContextEntry) context).left );
+            }
+            return !comparator.equals( ((ObjectVariableContextEntry) context).left, value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            if( value2 != null && value2 instanceof ShadowProxy ) {
+                return !comparator.equals( value2, value1 );
+            }
+            return !comparator.equals( value1, value2 );
+        }
+
+        public String toString() {
+            return "Object !=";
+        }
+    }
+
+    static class ShortEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortEqualEvaluator();
+
+        private ShortEqualEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return object2.isNull();
+            } else if ( object2.isNull() ) {
+                return false;
+            }
+            
+            return extractor.getShortValue( workingMemory, object1 ) == object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return false;
+            }
+            
+            return context.declaration.getExtractor().getShortValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right )) {
+                return context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return false;
+            }
+            
+            return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return false;
+            }
+            
+            return extractor1.getShortValue( workingMemory, object1 ) == extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Short ==";
+        }
+    }
+
+    static class ShortNotEqualEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long      serialVersionUID = 400L;
+        private static final Evaluator INSTANCE         = new ShortNotEqualEvaluator();
+
+        private ShortNotEqualEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            if ( extractor.isNullValue( workingMemory, object1 ) ) {
+                return !object2.isNull();
+            } else if ( object2.isNull() ) {
+                return true;
+            }
+            
+            return extractor.getShortValue( workingMemory, object1 ) != object2.getShortValue();
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
+                return !context.isRightNull();
+            } else if ( context.isRightNull() ) {
+                return true;
+            }
+            
+            return context.declaration.getExtractor().getShortValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            if ( context.extractor.isNullValue( workingMemory, right ) ) {
+                return !context.isLeftNull();
+            } else if ( context.isLeftNull() ) {
+                return true;
+            }
+            
+            return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( workingMemory, right );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            if (extractor1.isNullValue( workingMemory, object1 )) {
+                return !extractor2.isNullValue( workingMemory, object2 );
+            } else if (extractor2.isNullValue( workingMemory, object2 )) {
+                return true;
+            }
+            
+            return extractor1.getShortValue( workingMemory, object1 ) != extractor2.getShortValue( workingMemory, object2 );
+        }
+
+        public String toString() {
+            return "Short !=";
+        }
+    }
+
+    static class StringEqualEvaluator extends BaseEvaluator {
+        /**
+         *
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringEqualEvaluator();
+
+        private StringEqualEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   Operator.EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right == null;
+            }
+            return value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value == null;
+            }
+            return ((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 == null;
+            }
+            return value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "String ==";
+        }
+
+    }
+
+    static class StringNotEqualEvaluator extends BaseEvaluator {
+        /**
+         *
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringNotEqualEvaluator();
+
+        private StringNotEqualEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   Operator.NOT_EQUAL );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final Object value1 = extractor.getValue( workingMemory, object1 );
+            final Object value2 = object2.getValue();
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
+            if ( value == null ) {
+                return ((ObjectVariableContextEntry) context).right != null;
+            }
+            return !value.equals( ((ObjectVariableContextEntry) context).right );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final Object value = context.extractor.getValue( workingMemory, right );
+            if ( ((ObjectVariableContextEntry) context).left == null ) {
+                return value != null;
+            }
+            return !((ObjectVariableContextEntry) context).left.equals( value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return value2 != null;
+            }
+            return !value1.equals( value2 );
+        }
+
+        public String toString() {
+            return "String !=";
+        }
+    }
+
+    protected static class ObjectEqualsComparator {
+
+        // trying to implement runtime type coercion
+        public boolean equals( Object arg0, Object arg1 ) {
+            if ( arg0 == null ) {
+                return arg1 == null;
+            }
+            if( arg1 != null && arg1 instanceof ShadowProxy ) {
+                return arg1.equals( arg0 );
+            }
+            if( arg0 instanceof Number ){
+                double val0 = ((Number) arg0).doubleValue();
+                double val1 = 0;
+                if( arg1 instanceof Number ) {
+                    val1 = ((Number) arg1).doubleValue();
+                } else if( arg1 instanceof String ) {
+                    val1 = Double.parseDouble( ( String ) arg1 );
+                } else {
+                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
+                }
+                return val0 == val1; // in the future we may need to handle rounding errors 
+            } 
+            if( arg0 instanceof String ) {
+                return arg0.equals( arg1.toString() );
+            }
+            if( arg0 instanceof Boolean ) {
+                if( arg1 instanceof String ) {
+                    return ((Boolean)arg0).booleanValue() == Boolean.valueOf( (String)arg1 ).booleanValue();
+                }
+            }
+            if( arg0 instanceof Character ) {
+                if( arg1 instanceof String && ((String) arg1).length() == 1 ) {
+                    return ((Character)arg0).charValue() == ((String)arg1).charAt( 0 );
+                }
+            }
+            return arg0.equals( arg1 );
+        }
+    }
+    
+
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorCache.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorCache.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorCache.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorCache.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ValueType;
+import org.drools.spi.Evaluator;
+
+/**
+ * A simple helper class to store Evaluators for a given set of 
+ * value types and operators
+ * 
+ * @author etirelli
+ */
+public class EvaluatorCache implements Serializable {
+    
+
+    private static final long serialVersionUID = 5643974484372543392L;
+    private Map<ValueType, Map<Operator, Evaluator>> evaluators = new HashMap<ValueType, Map<Operator, Evaluator>>();
+    
+    public EvaluatorCache() {
+    }
+    
+    public void addEvaluator( final ValueType type, final Operator operator, final Evaluator evaluator ) {
+        Map<Operator, Evaluator> opEvalMap = this.evaluators.get( type );
+        if( opEvalMap == null ) {
+            opEvalMap = new HashMap<Operator, Evaluator>();
+            this.evaluators.put( type, opEvalMap );
+        }
+        opEvalMap.put( operator, evaluator );
+    }
+    
+    public Evaluator getEvaluator( final ValueType type, final Operator operator ) {
+        Map<Operator, Evaluator> opEvalMap = this.evaluators.get( type );
+        return opEvalMap != null ? opEvalMap.get( operator ) : null;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.containsKey( type );
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import org.drools.base.ValueType;
+import org.drools.spi.Evaluator;
+
+/**
+ * An evaluator definition interface that allows for pluggable
+ * evaluator implementation.
+ * 
+ * This interface is the registry entry point for all available
+ * evaluators and describes all evaluator capabilities
+ * 
+ * @author etirelli
+ */
+public interface EvaluatorDefinition {
+
+    /**
+     * Returns the list of identifies this
+     * evaluator implementation supports
+     * 
+     * @return
+     */
+    public String[] getEvaluatorIds();
+
+    /**
+     * My appologies to english speakers if the word "negatable" does not
+     * exists. :)
+     * 
+     * This method returns true if this evaluator supports negation. Example:
+     * 
+     * the "matches" operator supports "not matches" and so is "negatable" (!?)
+     * 
+     * @return
+     */
+    public boolean isNegatable();
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operatorId the string identifier of the evaluator           
+     *             
+     * @param isNegated true if the evaluator instance to be returned is
+     *                  the negated version of the evaluator.
+     *              
+     * @param parameterText some evaluators support parameters and these 
+     *                      parameters are defined as a String that is 
+     *                      parsed by the evaluator itself.
+     *                       
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  String operatorId,
+                                  boolean isNegated,
+                                  String parameterText);
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operator the operator implemented by the evaluator           
+     *             
+     * @param parameterText some evaluators support parameters and these 
+     *                      parameters are defined as a String that is 
+     *                      parsed by the evaluator itself.
+     *                       
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText);
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operator the operator implemented by the evaluator           
+     *             
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator);
+
+    /**
+     * Returns true in case this evaluator supports operations over values 
+     * of that specific type.
+     * 
+     * @param type
+     * @return
+     */
+    public boolean supportsType(ValueType type);
+
+    /**
+     * There are evaluators that operate on *fact handle* attributes and 
+     * evaluators that operate on *fact* attributes.
+     * 
+     * @return true if this evaluator operates on fact handle attributes
+     *         and false if it operates on fact attributes
+     */
+    public boolean operatesOnFactHandles();
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,11 +0,0 @@
-package org.drools.base.evaluators;
-
-import java.io.Serializable;
-
-import org.drools.spi.Evaluator;
-
-public interface EvaluatorFactory
-    extends
-    Serializable {
-    public Evaluator getEvaluator(Operator operator);
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorRegistry.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorRegistry.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorRegistry.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EvaluatorRegistry.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ValueType;
+import org.drools.spi.Evaluator;
+
+/**
+ * A registry class for all available evaluators
+ * 
+ * @author etirelli
+ */
+public class EvaluatorRegistry
+    implements
+    Serializable {
+
+    private static final long                serialVersionUID = -3047718531857258033L;
+
+    private Map<String, EvaluatorDefinition> evaluators;
+    private ClassLoader                      classloader;
+
+    /**
+     * Default constructor. The registry will use the context classloader (if available)
+     * to load the evaluator definition classes or this class classloader if it is 
+     * not available.
+     */
+    public EvaluatorRegistry() {
+        this( null );
+    }
+
+    /**
+     * Creates a new EvaluatorRegistry using the given classloader to load
+     * the evaluator definition classes. 
+     * 
+     * @param classloader the classloader to use to load evaluator definition
+     *                    classes. If it is null, try to obtain the context
+     *                    classloader. If it is also null, uses the same classloader
+     *                    that loaded this class.
+     *                    
+     */
+    public EvaluatorRegistry(ClassLoader classloader) {
+        this.evaluators = new HashMap<String, EvaluatorDefinition>();
+        if ( classloader != null ) {
+            this.classloader = classloader;
+        } else {
+            this.classloader = Thread.currentThread().getContextClassLoader() != null ? Thread.currentThread().getContextClassLoader() : this.getClass().getClassLoader();
+        }
+        
+        // loading default built in evaluators
+        this.addEvaluatorDefinition( new EqualityEvaluatorsDefinition() );
+        this.addEvaluatorDefinition( new ComparableEvaluatorsDefinition() );
+        this.addEvaluatorDefinition( new SetEvaluatorsDefinition() );
+        this.addEvaluatorDefinition( new MatchesEvaluatorsDefinition() );
+        this.addEvaluatorDefinition( new SoundslikeEvaluatorsDefinition() );
+    }
+
+    /**
+     * Adds an evaluator definition class to the registry using the
+     * evaluator class name. The class will be loaded and the corresponting
+     * evaluator ID will be added to the registry. In case there exists
+     * an implementation for that ID already, the new implementation will
+     * replace the previous one.
+     * 
+     * @param className the name of the class for the implementation definition.
+     *                  The class must implement the EvaluatorDefinition interface.
+     * 
+     * @return true if the new class implementation is replacing an old
+     *         implementation for the same evaluator ID. False otherwise.
+     */
+    public void addEvaluatorDefinition(String className) {
+        try {
+            Class<EvaluatorDefinition> defClass = (Class<EvaluatorDefinition>) this.classloader.loadClass( className );
+            EvaluatorDefinition def = defClass.newInstance();
+            addEvaluatorDefinition( def );
+        } catch ( ClassNotFoundException e ) {
+            throw new RuntimeDroolsException( "Class not found for evaluator definition: " + className,
+                                              e );
+        } catch ( InstantiationException e ) {
+            throw new RuntimeDroolsException( "Error instantiating class for evaluator definition: " + className,
+                                              e );
+        } catch ( IllegalAccessException e ) {
+            throw new RuntimeDroolsException( "Illegal access instantiating class for evaluator definition: " + className,
+                                              e );
+        }
+    }
+
+    /**
+     * Adds an evaluator definition class to the registry. In case there exists
+     * an implementation for that evaluator ID already, the new implementation will
+     * replace the previous one.
+     * 
+     * @param def the evaluator definition to be added.
+     */
+    public void addEvaluatorDefinition(EvaluatorDefinition def) {
+        for ( String id : def.getEvaluatorIds() ) {
+            this.evaluators.put( id,
+                                 def );
+        }
+    }
+
+    /**
+     * Returns the evaluator definition for the given evaluator ID
+     * or null if no one was found
+     * 
+     * @param evaluatorId
+     * @return
+     */
+    public EvaluatorDefinition getEvaluatorDefinition(String evaluatorId) {
+        return this.evaluators.get( evaluatorId );
+    }
+
+    /**
+     * Returns the evaluator definition for the given operator
+     * or null if no one was found
+     * 
+     * @param operator the operator implemented by the evaluator definition
+     * @return
+     */
+    public EvaluatorDefinition getEvaluatorDefinition(Operator operator) {
+        return this.evaluators.get( operator.getOperatorString() );
+    }
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operatorId the string identifier of the evaluator           
+     *             
+     * @param isNegated true if the evaluator instance to be returned is
+     *                  the negated version of the evaluator.
+     *              
+     * @param parameterText some evaluators support parameters and these 
+     *                      parameters are defined as a String that is 
+     *                      parsed by the evaluator itself.
+     *                       
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  String operatorId,
+                                  boolean isNegated,
+                                  String parameterText) {
+        return this.getEvaluatorDefinition( operatorId ).getEvaluator( type,
+                                                                       operatorId,
+                                                                       isNegated,
+                                                                       parameterText );
+    }
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operator the operator that evaluator implements           
+     *             
+     * @param parameterText some evaluators support parameters and these 
+     *                      parameters are defined as a String that is 
+     *                      parsed by the evaluator itself.
+     *                       
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.getEvaluatorDefinition( operator ).getEvaluator( type,
+                                                                     operator,
+                                                                     parameterText );
+    }
+
+    /**
+     * Returns the evaluator instance for the given type and the
+     * defined parameterText
+     * 
+     * @param type the type of the attributes this evaluator will 
+     *             operate on. This is important because the evaluator
+     *             may do optimizations and type coercion based on the 
+     *             types it is evaluating. It is also possible that 
+     *             this evaluator does not support a given type.
+     *             
+     * @param operator the operator that evaluator implements           
+     *             
+     * @return an Evaluator instance capable of evaluating expressions
+     *         between values of the given type, or null in case the type
+     *         is not supported. 
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.getEvaluatorDefinition( operator ).getEvaluator( type,
+                                                                     operator );
+    }
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FactTemplateFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,179 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-/**
- * This is the misc "bucket" evaluator factory for objects.
- * It is fairly limited in operations, 
- * and what operations are available are dependent on the exact type.
- * 
- * @author Michael Neale
- */
-public class FactTemplateFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new FactTemplateFactory();
-
-    private FactTemplateFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( FactTemplateFactory.INSTANCE == null ) {
-            FactTemplateFactory.INSTANCE = new FactTemplateFactory();
-        }
-        return FactTemplateFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return FactTemplateEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return FactTemplateNotEqualEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for FactTemplateEvaluator" );
-        }
-    }
-
-    static class FactTemplateEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FactTemplateEqualEvaluator();
-
-        private FactTemplateEqualEvaluator() {
-            super( ValueType.FACTTEMPLATE_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
-            }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
-            }
-            return ((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "FactTemplate ==";
-        }
-
-    }
-
-    static class FactTemplateNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FactTemplateNotEqualEvaluator();
-
-        private FactTemplateNotEqualEvaluator() {
-            super( ValueType.FACTTEMPLATE_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right != null;
-            }
-            return !value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value != null;
-            }
-            return !((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "FactTemplate !=";
-        }
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FloatFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,456 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.DoubleVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class FloatFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new FloatFactory();
-
-    private FloatFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( FloatFactory.INSTANCE == null ) {
-            FloatFactory.INSTANCE = new FloatFactory();
-        }
-        return FloatFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return FloatEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return FloatNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return FloatLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return FloatLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return FloatGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return FloatGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return FloatMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return FloatNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for FloatEvaluator" );
-        }
-    }
-
-    static class FloatEqualEvaluator extends BaseEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatEqualEvaluator();
-
-        private FloatEqualEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) == object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) == ((DoubleVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left == context.extractor.getFloatValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) == extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float ==";
-        }
-    }
-
-    static class FloatNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatNotEqualEvaluator();
-
-        private FloatNotEqualEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) != object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return context.declaration.getExtractor().getFloatValue( workingMemory, left ) != ((DoubleVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).left != context.extractor.getFloatValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) != extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float !=";
-        }
-    }
-
-    static class FloatLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatLessEvaluator();
-
-        private FloatLessEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) < object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right < context.declaration.getExtractor().getFloatValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( workingMemory, right ) < ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) < extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float <";
-        }
-    }
-
-    static class FloatLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatLessOrEqualEvaluator();
-
-        private FloatLessOrEqualEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) <= object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right <= context.declaration.getExtractor().getFloatValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( workingMemory, right ) <= ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) <= extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float <=";
-        }
-    }
-
-    static class FloatGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatGreaterEvaluator();
-
-        private FloatGreaterEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) > object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right > context.declaration.getExtractor().getFloatValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( workingMemory, right ) > ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) > extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float >";
-        }
-    }
-
-    static class FloatGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new FloatGreaterOrEqualEvaluator();
-
-        private FloatGreaterOrEqualEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor.getFloatValue( workingMemory, object1 ) >= object2.getFloatValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return ((DoubleVariableContextEntry) context).right >= context.declaration.getExtractor().getFloatValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return context.extractor.getFloatValue( workingMemory, right ) >= ((DoubleVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            // TODO: we are not handling delta right now... maybe we should
-            return extractor1.getFloatValue( workingMemory, object1 ) >= extractor2.getFloatValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Float >=";
-        }
-    }
-    
-    static class FloatMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatMemberOfEvaluator();
-
-        private FloatMemberOfEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Float memberOf";
-        }
-    }
-
-    static class FloatNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new FloatNotMemberOfEvaluator();
-
-        private FloatNotMemberOfEvaluator() {
-            super( ValueType.PFLOAT_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Float not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IntegerFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,436 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class IntegerFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new IntegerFactory();
-
-    private IntegerFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( IntegerFactory.INSTANCE == null ) {
-            IntegerFactory.INSTANCE = new IntegerFactory();
-        }
-        return IntegerFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return IntegerEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return IntegerNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return IntegerLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return IntegerLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return IntegerGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return IntegerGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return IntegerMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return IntegerNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for IntegerEvaluator" );
-        }
-    }
-
-    static class IntegerEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerEqualEvaluator();
-
-        private IntegerEqualEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getIntValue( workingMemory, object1 ) == object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getIntValue( workingMemory, left ) == ((LongVariableContextEntry) context).right; 
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object object2) {
-            if ( context.extractor.isNullValue( workingMemory, object2 )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return context.extractor.getIntValue( workingMemory, object2 ) == ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {            
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getIntValue( workingMemory, object1 ) == extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer ==";
-        }
-
-    }
-
-    static class IntegerNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerNotEqualEvaluator();
-
-        private IntegerNotEqualEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {        	          
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getIntValue( workingMemory, object1 ) != object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            return context.declaration.getExtractor().getIntValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object object2) {
-            if ( context.extractor.isNullValue( workingMemory, object2 ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return context.extractor.getIntValue( workingMemory, object2 ) != ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getIntValue( workingMemory, object1 ) != extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer !=";
-        }
-    }
-
-    static class IntegerLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerLessEvaluator();
-
-        private IntegerLessEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getIntValue( workingMemory, object1 ) < object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getIntValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getIntValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getIntValue( workingMemory, object1 ) < extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer <";
-        }
-    }
-
-    static class IntegerLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerLessOrEqualEvaluator();
-
-        private IntegerLessOrEqualEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getIntValue( workingMemory, object1 ) <= object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getIntValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getIntValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getIntValue( workingMemory, object1 ) <= extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer <=";
-        }
-    }
-
-    static class IntegerGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerGreaterEvaluator();
-
-        private IntegerGreaterEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getIntValue( workingMemory, object1 ) > object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getIntValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getIntValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getIntValue( workingMemory, object1 ) > extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer >";
-        }
-    }
-
-    static class IntegerGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new IntegerGreaterOrEqualEvaluator();
-
-        private IntegerGreaterOrEqualEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getIntValue( workingMemory, object1 ) >= object2.getIntValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getIntValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getIntValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getIntValue( workingMemory, object1 ) >= extractor2.getIntValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Integer >=";
-        }
-    }
-    
-    static class IntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerMemberOfEvaluator();
-
-        private IntegerMemberOfEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Integer memberOf";
-        }
-    }
-
-    static class IntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new IntegerNotMemberOfEvaluator();
-
-        private IntegerNotMemberOfEvaluator() {
-            super( ValueType.PINTEGER_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Integer not memberOf";
-        }
-    }
-    
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/LongFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,434 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class LongFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new LongFactory();
-
-    private LongFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( LongFactory.INSTANCE == null ) {
-            LongFactory.INSTANCE = new LongFactory();
-        }
-        return LongFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return LongEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return LongNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return LongLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return LongLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return LongGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return LongGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return LongMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return LongNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for LongEvaluator" );
-        }
-    }
-
-    static class LongEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongEqualEvaluator();
-
-        private LongEqualEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getLongValue( workingMemory, object1 ) == object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getLongValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return ((LongVariableContextEntry) context).left == context.extractor.getLongValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getLongValue( workingMemory, object1 ) == extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long ==";
-        }
-    }
-
-    static class LongNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongNotEqualEvaluator();
-
-        private LongNotEqualEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getLongValue( workingMemory, object1 ) != object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            return context.declaration.getExtractor().getLongValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return ((LongVariableContextEntry) context).left != context.extractor.getLongValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getLongValue( workingMemory, object1 ) != extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long !=";
-        }
-    }
-
-    static class LongLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongLessEvaluator();
-
-        private LongLessEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getLongValue( workingMemory, object1 ) < object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getLongValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getLongValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getLongValue( workingMemory, object1 ) < extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long <";
-        }
-    }
-
-    static class LongLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongLessOrEqualEvaluator();
-
-        private LongLessOrEqualEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getLongValue( workingMemory, object1 ) <= object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getLongValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getLongValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getLongValue( workingMemory, object1 ) <= extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long <=";
-        }
-    }
-
-    static class LongGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongGreaterEvaluator();
-
-        private LongGreaterEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getLongValue( workingMemory, object1 ) > object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getLongValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getLongValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getLongValue( workingMemory, object1 ) > extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long >";
-        }
-    }
-
-    static class LongGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private final static Evaluator INSTANCE         = new LongGreaterOrEqualEvaluator();
-
-        private LongGreaterOrEqualEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getLongValue( workingMemory, object1 ) >= object2.getLongValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getLongValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getLongValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getLongValue( workingMemory, object1 ) >= extractor2.getLongValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Long >=";
-        }
-    }
-
-    static class LongMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongMemberOfEvaluator();
-
-        private LongMemberOfEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Long memberOf";
-        }
-    }
-
-    static class LongNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new LongNotMemberOfEvaluator();
-
-        private LongNotMemberOfEvaluator() {
-            super( ValueType.PLONG_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Long not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+
+/**
+ * This class defines the matches evaluator
+ * 
+ * @author etirelli
+ */
+public class MatchesEvaluatorsDefinition implements EvaluatorDefinition {
+    
+    public static final Operator  MATCHES       = Operator.addOperatorToRegistry( "matches",
+                                                                                  false );
+    public static final Operator  NOT_MATCHES   = Operator.addOperatorToRegistry( "matches",
+                                                                                  true );
+    
+    private static final String[] SUPPORTED_IDS = { MATCHES.getOperatorString() };
+    private EvaluatorCache evaluators = new EvaluatorCache() {
+        private static final long serialVersionUID = 4782368623L;
+        {
+            addEvaluator( ValueType.STRING_TYPE,        MATCHES,         StringMatchesEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,        NOT_MATCHES,     StringNotMatchesEvaluator.INSTANCE );
+        }
+    };
+    
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        return this.evaluators.getEvaluator( type, Operator.determineOperator( operatorId, isNegated ) );
+    }
+
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    public boolean isNegatable() {
+        return true;
+    }
+
+    public boolean operatesOnFactHandles() {
+        return false;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.supportsType( type );
+    }
+
+    /*  *********************************************************
+     *           Evaluator Implementations
+     *  *********************************************************
+     */
+    static class StringMatchesEvaluator extends BaseEvaluator {
+        /**
+         *
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringMatchesEvaluator();
+
+        private StringMatchesEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   MATCHES );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
+            final String value2 = (String) object2.getValue();
+            if ( value1 == null ) {
+                return false;
+            }
+            return value1.matches( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final String value = (String) ((ObjectVariableContextEntry) context).right;
+            if ( value == null ) {
+                return false;
+            }
+            return value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
+            if ( value == null ) {
+                return false;
+            }
+            return value.matches( (String) ((ObjectVariableContextEntry) context).left );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return ((String) value1).matches( (String) value2 );
+        }
+
+        public String toString() {
+            return "String matches";
+        }
+    }
+
+    static class StringNotMatchesEvaluator extends BaseEvaluator {
+        /**
+         *
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringNotMatchesEvaluator();
+
+        private StringNotMatchesEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   NOT_MATCHES );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
+            final String value2 = (String) object2.getValue();
+            if ( value1 == null ) {
+                return false;
+            }
+            return ! value1.matches( value2 );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final String value = (String) ((ObjectVariableContextEntry) context).right;
+            if ( value == null ) {
+                return false;
+            }
+            return ! value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
+            if ( value == null ) {
+                return false;
+            }
+            return ! value.matches( (String) ((ObjectVariableContextEntry) context).left );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return ! ((String) value1).matches( (String) value2 );
+        }
+
+        public String toString() {
+            return "String not matches";
+        }
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,637 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.Collection;
-import java.util.Comparator;
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ShadowProxy;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-import org.drools.util.ShadowProxyUtils;
-
-/**
- * This is the misc "bucket" evaluator factory for objects.
- * It is fairly limited in operations, 
- * and what operations are available are dependent on the exact type.
- * 
- * This supports "<" and ">" etc by requiring objects to implement the comparable interface.
- * Of course, literals will not work with comparator, as it has no way
- * of converting from literal to the appropriate type.
- * 
- * @author Michael Neale
- */
-public class ObjectFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new ObjectFactory();
-
-    private ObjectFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( ObjectFactory.INSTANCE == null ) {
-            ObjectFactory.INSTANCE = new ObjectFactory();
-        }
-        return ObjectFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return ObjectEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return ObjectNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return ObjectLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return ObjectLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return ObjectGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return ObjectGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.CONTAINS ) {
-            return ObjectContainsEvaluator.INSTANCE;
-        } else if ( operator == Operator.EXCLUDES ) {
-            return ObjectExcludesEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_CONTAINS) {
-            return ObjectExcludesEvaluator.INSTANCE; // 'not contains' and 'excludes' are synonyms
-        } else if ( operator == Operator.MEMBEROF ) {
-            return ObjectMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return ObjectNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for ObjectEvaluator" );
-        }
-    }
-
-    static class ObjectEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectEqualEvaluator();
-        private static final ObjectEqualsComparator comparator = new ObjectEqualsComparator();        
-
-        private ObjectEqualEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value1 = context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value1 = context.extractor.getValue( workingMemory, right );
-            final Object value2 = ((ObjectVariableContextEntry) context).left;
-            return comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            return comparator.equals( value1, value2 );
-        }
-
-        public String toString() {
-            return "Object ==";
-        }
-
-    }
-
-    static class ObjectNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectNotEqualEvaluator();
-        private static final ObjectEqualsComparator comparator = new ObjectEqualsComparator();        
-
-        private ObjectNotEqualEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            return !comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value1 = context.declaration.getExtractor().getValue( workingMemory, left );
-            final Object value2 = ((ObjectVariableContextEntry) context).right;
-            return !comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value1 = context.extractor.getValue( workingMemory, right );
-            final Object value2 = ((ObjectVariableContextEntry) context).left;
-            return !comparator.equals( value1, value2 );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            return !comparator.equals( value1, value2 );
-        }
-
-        public String toString() {
-            return "Object !=";
-        }
-    }
-
-    static class ObjectLessEvaluator extends BaseEvaluator {
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectLessEvaluator();
-        private static final ObjectComparator comparator = new ObjectComparator();
-
-        private ObjectLessEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
-            return comparator.compare( comp, object2.getValue() ) < 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) < 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
-            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) < 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
-            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) < 0;
-        }
-
-        public String toString() {
-            return "Object <";
-        }
-    }
-
-    static class ObjectLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectLessOrEqualEvaluator();
-        private static final ObjectComparator comparator = new ObjectComparator();
-
-
-        private ObjectLessOrEqualEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
-            return comparator.compare( comp, object2.getValue() ) <= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) <= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
-            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) <= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
-            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) <= 0;
-        }
-
-        public String toString() {
-            return "Object <=";
-        }
-    }
-
-    static class ObjectGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectGreaterEvaluator();
-        private static final ObjectComparator comparator = new ObjectComparator();
-
-
-        private ObjectGreaterEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
-            return comparator.compare( comp, object2.getValue() ) > 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) > 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
-            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) > 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
-            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) > 0;
-        }
-
-        public String toString() {
-            return "Object >";
-        }
-    }
-
-    static class ObjectGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectGreaterOrEqualEvaluator();
-        private static final ObjectComparator comparator = new ObjectComparator();
-
-
-        private ObjectGreaterOrEqualEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor.getValue( workingMemory, object1 );
-            return comparator.compare( comp, object2.getValue() ) >= 0;
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) ((ObjectVariableContextEntry) context).right;
-            return comparator.compare( comp, context.declaration.getExtractor().getValue( workingMemory, left ) ) >= 0;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) context.extractor.getValue( workingMemory, right );
-            return comparator.compare( comp, ((ObjectVariableContextEntry) context).left ) >= 0;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            final Comparable comp = (Comparable) extractor1.getValue( workingMemory, object1 );
-            return comparator.compare( comp, extractor2.getValue( workingMemory, object2 ) ) >= 0;
-        }
-
-        public String toString() {
-            return "Object >=";
-        }
-    }
-
-    static class ObjectContainsEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectContainsEvaluator();
-
-        private ObjectContainsEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.CONTAINS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value = object2.getValue();
-            final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
-            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
-            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = ((ObjectVariableContextEntry) context).left;
-            final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
-            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value = extractor2.getValue( workingMemory, object2 );
-            final Collection col = (Collection) extractor1.getValue( workingMemory, object1 );
-            return ( col == null ) ? false : ShadowProxyUtils.contains( col, value );
-        }
-
-        public String toString() {
-            return "Object contains";
-        }
-    }
-
-    static class ObjectExcludesEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectExcludesEvaluator();
-
-        private ObjectExcludesEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.EXCLUDES );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value = object2.getValue();
-            final Collection col = (Collection) extractor.getValue( workingMemory, object1 );
-            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
-            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = ((ObjectVariableContextEntry) context).left;
-            final Collection col = (Collection) context.extractor.getValue( workingMemory, right );
-            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value = extractor2.getValue( workingMemory, object2 );
-            final Collection col = (Collection) extractor1.getValue( workingMemory, object1 );
-            return ( col == null ) ? true : !ShadowProxyUtils.contains( col, value );
-        }
-
-        public String toString() {
-            return "Object excludes";
-        }
-    }
-
-    static class ObjectMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectMemberOfEvaluator();
-
-        private ObjectMemberOfEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Object memberOf";
-        }
-    }
-
-    static class ObjectNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ObjectNotMemberOfEvaluator();
-
-        private ObjectNotMemberOfEvaluator() {
-            super( ValueType.OBJECT_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Object not memberOf";
-        }
-    }
-    
-    protected static class ObjectEqualsComparator {
-
-        // trying to implement runtime type coercion
-        public boolean equals( Object arg0, Object arg1 ) {
-            if ( arg0 == null ) {
-                return arg1 == null;
-            }
-            if( arg1 != null && arg1 instanceof ShadowProxy ) {
-                return arg1.equals( arg0 );
-            }
-            if( arg0 instanceof Number ){
-                double val0 = ((Number) arg0).doubleValue();
-                double val1 = 0;
-                if( arg1 instanceof Number ) {
-                    val1 = ((Number) arg1).doubleValue();
-                } else if( arg1 instanceof String ) {
-                    val1 = Double.parseDouble( ( String ) arg1 );
-                } else {
-                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
-                }
-                return val0 == val1; // in the future we may need to handle rounding errors 
-            } 
-            if( arg0 instanceof String ) {
-                return arg0.equals( arg1.toString() );
-            }
-            if( arg0 instanceof Boolean ) {
-                if( arg1 instanceof String ) {
-                    return ((Boolean)arg0).booleanValue() == Boolean.valueOf( (String)arg1 ).booleanValue();
-                }
-            }
-            if( arg0 instanceof Character ) {
-                if( arg1 instanceof String && ((String) arg1).length() == 1 ) {
-                    return ((Character)arg0).charValue() == ((String)arg1).charAt( 0 );
-                }
-            }
-            return arg0.equals( arg1 );
-        }
-    }
-    
-    protected static class ObjectComparator implements Comparator {
-        // this is a stateless object, and so, can be shared among threads
-        // PLEASE: do not add state to it, unless you remove all concurrent 
-        // calls to this class instances
-
-        public int compare(Object arg0,
-                           Object arg1) {
-            if( arg0 instanceof Double || arg0 instanceof Float ) {
-                double val0 = ((Number) arg0).doubleValue();
-                double val1 = 0;
-                if( arg1 instanceof Number ) {
-                    val1 = ((Number) arg1).doubleValue();
-                } else if( arg1 instanceof String ) {
-                    val1 = Double.parseDouble( ( String ) arg1 );
-                } else {
-                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
-                }
-                return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
-            } else if( arg0 instanceof Number ){
-                long val0 = ((Number) arg0).longValue();
-                long val1 = 0;
-                if( arg1 instanceof Number ) {
-                    val1 = ((Number) arg1).longValue();
-                } else if( arg1 instanceof String ) {
-                    val1 = Long.parseLong( ( String ) arg1 ); 
-                } else {
-                    throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a long value to compare it to "+arg0.getClass() );
-                }
-                return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
-            } else if( arg0 instanceof String ) {
-                try {
-                    double val0 = Double.parseDouble( (String) arg0 );
-                    double val1 = 0;
-                    if( arg1 instanceof Number ) {
-                        val1 = ((Number) arg1).doubleValue();
-                    } else if( arg1 instanceof String ) {
-                        val1 = Double.parseDouble( ( String ) arg1 );
-                    } else {
-                        throw new ClassCastException( "Not possible to convert "+arg1.getClass()+" into a double value to compare it to "+arg0.getClass() );
-                    }
-                    return val0 > val1 ? 1 : val0 < val1 ? -1 : 0;
-                } catch( NumberFormatException nfe ) {
-                    return ( (String) arg0).compareTo( arg1.toString() );
-                }
-                
-            }
-            try {
-                return ((Comparable)arg0).compareTo( arg1 );
-            } catch ( ClassCastException cce ) {
-                throw new ClassCastException( "Not possible to compare a "+arg0.getClass()+" with a "+arg1.getClass());
-            }
-        }
-    }
-    
-    
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/Operator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/Operator.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/Operator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,6 +1,9 @@
 package org.drools.base.evaluators;
 
 import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.drools.RuntimeDroolsException;
 
@@ -8,67 +11,85 @@
     implements
     Serializable {
 
-    private static final long    serialVersionUID = 400L;
+    private static final long                  serialVersionUID = 400L;
 
-    public static final Operator EQUAL            = new Operator( "==" );
-    public static final Operator NOT_EQUAL        = new Operator( "!=" );
-    public static final Operator LESS             = new Operator( "<" );
-    public static final Operator LESS_OR_EQUAL    = new Operator( "<=" );
-    public static final Operator GREATER          = new Operator( ">" );
-    public static final Operator GREATER_OR_EQUAL = new Operator( ">=" );
-    public static final Operator CONTAINS         = new Operator( "contains" );
-    public static final Operator EXCLUDES         = new Operator( "excludes" );
-    public static final Operator NOT_CONTAINS     = new Operator( "not contains" );
-    public static final Operator MATCHES          = new Operator( "matches" );
-    public static final Operator NOT_MATCHES      = new Operator( "not matches" );
-    public static final Operator MEMBEROF         = new Operator( "memberOf" );
-    public static final Operator NOTMEMBEROF      = new Operator( "not memberOf" );
+    // a static private cache so that pluggable operator can register their implementations
+    // it is automatically initialized with common operator implementations
+    private static final Map<String, Operator> CACHE            = Collections.synchronizedMap( new HashMap<String, Operator>() );
 
-    public static final Operator SOUNDSLIKE       = new Operator("soundslike");
+    // these static operator constants are kept here just to make it easier for the engine
+    // to reference common used operators. The addition of new constants here is not
+    // advisable though.
+    public static final Operator               EQUAL            = addOperatorToRegistry( "==",
+                                                                                         false );
+    public static final Operator               NOT_EQUAL        = addOperatorToRegistry( "!=",
+                                                                                         false );
+    public static final Operator               LESS             = addOperatorToRegistry( "<",
+                                                                                         false );
+    public static final Operator               LESS_OR_EQUAL    = addOperatorToRegistry( "<=",
+                                                                                         false );
+    public static final Operator               GREATER          = addOperatorToRegistry( ">",
+                                                                                         false );
+    public static final Operator               GREATER_OR_EQUAL = addOperatorToRegistry( ">=",
+                                                                                         false );
 
-    private String               operator;
+    /**
+     * Creates a new Operator instance for the given parameters, 
+     * adds it to the registry and return it
+     * 
+     * @param operatorId the identification symbol of the operator
+     * @param isNegated true if it is negated
+     * 
+     * @return the newly created operator
+     */
+    public static Operator addOperatorToRegistry(final String operatorId,
+                                                 final boolean isNegated) {
+        Operator op = new Operator( operatorId,
+                                    isNegated );
+        CACHE.put( getKey( operatorId,
+                           isNegated ),
+                   op );
+        return op;
+    }
 
-    private Operator(final String operator) {
+    /**
+     * Returns the operator instance for the given parameters
+     * 
+     * @param operatorId the identification symbol of the operator
+     * @param isNegated true if it is negated
+     * 
+     * @return the operator in case it exists
+     */
+    public static Operator determineOperator(final String operatorId,
+                                             final boolean isNegated) {
+        Operator op = CACHE.get( getKey( operatorId,
+                                         isNegated ) );
+        if ( op == null ) {
+            throw new RuntimeDroolsException( "unable to determine operator for symbol [" + (isNegated ? "not " : "") + operatorId + "]" );
+        }
+        return op;
+    }
+
+    private static String getKey(final String string,
+                                 final boolean isNegated) {
+        return isNegated + ":" + string;
+    }
+
+    // This class attributes
+    private String  operator;
+    private boolean isNegated;
+
+    private Operator(final String operator,
+                     final boolean isNegated) {
         this.operator = operator;
+        this.isNegated = isNegated;
     }
 
     private Object readResolve() throws java.io.ObjectStreamException {
-        return determineOperator( this.operator );
+        return determineOperator( this.operator,
+                                  this.isNegated );
     }
 
-    public static Operator determineOperator(final String string) {
-        if ( string.equals( "==" ) ) {
-            return Operator.EQUAL;
-        } else if ( string.equals( "!=" ) ) {
-            return Operator.NOT_EQUAL;
-        } else if ( string.equals( "<" ) ) {
-            return Operator.LESS;
-        } else if ( string.equals( "<=" ) ) {
-            return Operator.LESS_OR_EQUAL;
-        } else if ( string.equals( ">" ) ) {
-            return Operator.GREATER;
-        } else if ( string.equals( ">=" ) ) {
-            return Operator.GREATER_OR_EQUAL;
-        } else if ( string.equals( "contains" ) ) {
-            return Operator.CONTAINS;
-        } else if ( string.equals( "not contains" ) ) {
-            return Operator.NOT_CONTAINS;
-        } else if ( string.equals( "matches" ) ) {
-            return Operator.MATCHES;
-        } else if ( string.equals( "not matches" ) ) {
-            return Operator.NOT_MATCHES;
-        } else if ( string.equals( "excludes" ) ) {
-            return Operator.EXCLUDES;
-        } else if ( string.equals( "memberOf" ) ) {
-            return Operator.MEMBEROF;
-        } else if ( string.equals( "not memberOf" ) ) {
-            return Operator.NOTMEMBEROF;
-        } else if ( string.equals( "soundslike" ) ) {
-            return Operator.SOUNDSLIKE;
-        }
-        throw new RuntimeDroolsException( "unable to determine operator for String [" + string + "]" );
-    }
-
     public String toString() {
         return "Operator = '" + this.operator + "'";
     }
@@ -76,16 +97,31 @@
     public String getOperatorString() {
         return this.operator;
     }
+    
+    public boolean isNegated() {
+        return this.isNegated;
+    }
 
+    @Override
     public int hashCode() {
-        return this.operator.hashCode();
+        final int PRIME = 31;
+        int result = super.hashCode();
+        result = PRIME * result + (isNegated ? 1231 : 1237);
+        result = PRIME * result + ((operator == null) ? 0 : operator.hashCode());
+        return result;
     }
 
-    public boolean equals(final Object object) {
-        if ( object == this ) {
-            return true;
-        }
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final Operator other = (Operator) obj;
+        if ( isNegated != other.isNegated ) return false;
+        if ( operator == null ) {
+            if ( other.operator != null ) return false;
+        } else if ( !operator.equals( other.operator ) ) return false;
+        return true;
+    }
 
-        return false;
-    }
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,1108 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import java.util.Collection;
+
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+import org.drools.util.ShadowProxyUtils;
+
+/**
+ * This class defines all the set built in 
+ * evaluators like contains, memberOf, etc.
+ * 
+ * @author etirelli
+ */
+public class SetEvaluatorsDefinition
+    implements
+    EvaluatorDefinition {
+
+    public static final Operator  CONTAINS      = Operator.addOperatorToRegistry( "contains",
+                                                                                  false );
+    public static final Operator  NOT_CONTAINS  = Operator.addOperatorToRegistry( "contains",
+                                                                                  true );
+    public static final Operator  EXCLUDES      = Operator.addOperatorToRegistry( "excludes",
+                                                                                  false );
+    public static final Operator  NOT_EXCLUDES  = Operator.addOperatorToRegistry( "excludes",
+                                                                                  true );
+    public static final Operator  MEMBEROF      = Operator.addOperatorToRegistry( "memberOf",
+                                                                                  false );
+    public static final Operator  NOT_MEMBEROF  = Operator.addOperatorToRegistry( "memberOf",
+                                                                                  true );
+
+    private static final String[] SUPPORTED_IDS = {CONTAINS.getOperatorString(), EXCLUDES.getOperatorString(), MEMBEROF.getOperatorString()};
+    private EvaluatorCache     evaluators    = new EvaluatorCache() {
+        private static final long serialVersionUID = 4782368623L;
+        {
+            addEvaluator( ValueType.ARRAY_TYPE,                          CONTAINS,                          ArrayContainsEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,                          NOT_CONTAINS,                      ArrayExcludesEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,                          EXCLUDES,                          ArrayExcludesEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,                          NOT_EXCLUDES,                      ArrayContainsEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,                          MEMBEROF,                          ArrayMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.ARRAY_TYPE,                          NOT_MEMBEROF,                      ArrayNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,                    MEMBEROF,                          BigDecimalMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_DECIMAL_TYPE,                    NOT_MEMBEROF,                      BigDecimalNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,                    MEMBEROF,                          BigIntegerMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BIG_INTEGER_TYPE,                    NOT_MEMBEROF,                      BigIntegerNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BOOLEAN_TYPE,                        MEMBEROF,                          BooleanMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BOOLEAN_TYPE,                        NOT_MEMBEROF,                      BooleanNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBOOLEAN_TYPE,                       MEMBEROF,                          BooleanMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBOOLEAN_TYPE,                       NOT_MEMBEROF,                      BooleanNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,                           MEMBEROF,                          ByteMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.BYTE_TYPE,                           NOT_MEMBEROF,                      ByteNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,                          MEMBEROF,                          ByteMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PBYTE_TYPE,                          NOT_MEMBEROF,                      ByteNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,                           MEMBEROF,                          CharacterMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.CHAR_TYPE,                           NOT_MEMBEROF,                      CharacterNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,                          MEMBEROF,                          CharacterMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PCHAR_TYPE,                          NOT_MEMBEROF,                      CharacterNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,                           MEMBEROF,                          DateMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.DATE_TYPE,                           NOT_MEMBEROF,                      DateNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,                         MEMBEROF,                          DoubleMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.DOUBLE_TYPE,                         NOT_MEMBEROF,                      DoubleNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,                        MEMBEROF,                          DoubleMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PDOUBLE_TYPE,                        NOT_MEMBEROF,                      DoubleNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,                          MEMBEROF,                          FloatMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.FLOAT_TYPE,                          NOT_MEMBEROF,                      FloatNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,                         MEMBEROF,                          FloatMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PFLOAT_TYPE,                         NOT_MEMBEROF,                      FloatNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,                        MEMBEROF,                          IntegerMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.INTEGER_TYPE,                        NOT_MEMBEROF,                      IntegerNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,                       MEMBEROF,                          IntegerMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PINTEGER_TYPE,                       NOT_MEMBEROF,                      IntegerNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,                           MEMBEROF,                          LongMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.LONG_TYPE,                           NOT_MEMBEROF,                      LongNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,                          MEMBEROF,                          LongMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PLONG_TYPE,                          NOT_MEMBEROF,                      LongNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         CONTAINS,                          ObjectContainsEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         NOT_CONTAINS,                      ObjectExcludesEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         EXCLUDES,                          ObjectExcludesEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         NOT_EXCLUDES,                      ObjectContainsEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         MEMBEROF,                          ObjectMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.OBJECT_TYPE,                         NOT_MEMBEROF,                      ObjectNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,                          MEMBEROF,                          ShortMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.SHORT_TYPE,                          NOT_MEMBEROF,                      ShortNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,                         MEMBEROF,                          ShortMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.PSHORT_TYPE,                         NOT_MEMBEROF,                      ShortNotMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,                         MEMBEROF,                          StringMemberOfEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,                         NOT_MEMBEROF,                      StringNotMemberOfEvaluator.INSTANCE );
+        }
+    };
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             Operator.determineOperator( operatorId,
+                                                                         isNegated ) );
+    }
+
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    public boolean isNegatable() {
+        return true;
+    }
+
+    public boolean operatesOnFactHandles() {
+        return false;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.supportsType( type );
+    }
+
+    /*  *********************************************************
+     *                Evaluator Implementations
+     *  ********************************************************* 
+     */
+    static class ArrayContainsEvaluator extends BaseEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayContainsEvaluator();
+
+        private ArrayContainsEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   CONTAINS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value = object2.getValue();
+            final Object[] array = (Object[]) extractor.getValue( workingMemory,
+                                                                  object1 );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = ((ObjectVariableContextEntry) context).left;
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
+                                                                          right );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value = extractor2.getValue( workingMemory,
+                                                      object2 );
+            final Object[] array = (Object[]) extractor1.getValue( workingMemory,
+                                                                   object1 );
+
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public String toString() {
+            return "Array contains";
+        }
+    }
+
+    static class ArrayExcludesEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayExcludesEvaluator();
+
+        private ArrayExcludesEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   EXCLUDES );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value = object2.getValue();
+            final Object[] array = (Object[]) extractor.getValue( workingMemory,
+                                                                  object1 );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).right;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = ((ObjectVariableContextEntry) context).left;
+            final Object[] array = (Object[]) context.extractor.getValue( workingMemory,
+                                                                          right );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value = extractor2.getValue( workingMemory,
+                                                      object2 );
+            final Object[] array = (Object[]) extractor1.getValue( workingMemory,
+                                                                   object1 );
+
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public String toString() {
+            return "Array excludes";
+        }
+    }
+
+    static class ArrayMemberOfEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayMemberOfEvaluator();
+
+        private ArrayMemberOfEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   MEMBEROF );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object[] array = (Object[]) object2.getValue();
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory,
+                                                                                           left );
+            final Object value = ((ObjectVariableContextEntry) context).right;
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
+                                                                   object2 );
+            final Object value = extractor1.getValue( workingMemory,
+                                                      object1 );
+
+            if ( array == null ) return false;
+            return ShadowProxyUtils.contains( array,
+                                              value );
+        }
+
+        public String toString() {
+            return "Array memberOf";
+        }
+    }
+
+    static class ArrayNotMemberOfEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ArrayNotMemberOfEvaluator();
+
+        private ArrayNotMemberOfEvaluator() {
+            super( ValueType.ARRAY_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object[] array = (Object[]) object2.getValue();
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object[] array = (Object[]) context.declaration.getExtractor().getValue( workingMemory,
+                                                                                           left );
+            final Object value = ((ObjectVariableContextEntry) context).right;
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object[] array = (Object[]) ((ObjectVariableContextEntry) context).left;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object[] array = (Object[]) extractor2.getValue( workingMemory,
+                                                                   object2 );
+            final Object value = extractor1.getValue( workingMemory,
+                                                      object1 );
+
+            if ( array == null ) return true;
+            return !ShadowProxyUtils.contains( array,
+                                               value );
+        }
+
+        public String toString() {
+            return "Array not memberOf";
+        }
+    }
+
+    static abstract class BaseMemberOfEvaluator extends BaseEvaluator {
+
+        private static final long serialVersionUID = 2017803222427893249L;
+
+        public BaseMemberOfEvaluator(ValueType type,
+                                     Operator operator) {
+            super( type,
+                   operator );
+        }
+
+        public ValueType getCoercedValueType() {
+            // during evaluation, always coerce to object
+            return ValueType.OBJECT_TYPE;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            if ( object2.isNull() ) {
+                return false;
+            } else if ( !object2.isCollectionField() ) {
+                throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object2.getValue().getClass() );
+            }
+            final Collection col = (Collection) object2.getValue();
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            return ShadowProxyUtils.contains( col,
+                                              value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object object = context.declaration.getExtractor().getValue( workingMemory,
+                                                                               left );
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = ((ObjectVariableContextEntry) context).right;
+            return ShadowProxyUtils.contains( col,
+                                              value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object object = ((ObjectVariableContextEntry) context).left;
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            return ShadowProxyUtils.contains( col,
+                                              value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object object = extractor2.getValue( workingMemory,
+                                                       object2 );
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = extractor1.getValue( workingMemory,
+                                                      object1 );
+            return ShadowProxyUtils.contains( col,
+                                              value );
+        }
+
+        public abstract String toString();
+
+    }
+
+    static abstract class BaseNotMemberOfEvaluator extends BaseEvaluator {
+
+        private static final long serialVersionUID = -8730331781980886901L;
+
+        public BaseNotMemberOfEvaluator(ValueType type,
+                                        Operator operator) {
+            super( type,
+                   operator );
+        }
+
+        public ValueType getCoercedValueType() {
+            // during evaluation, always coerce to object
+            return ValueType.OBJECT_TYPE;
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            if ( object2.isNull() ) {
+                return false;
+            } else if ( !object2.isCollectionField() ) {
+                throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object2.getValue().getClass() );
+            }
+            final Collection col = (Collection) object2.getValue();
+            final Object value = extractor.getValue( workingMemory,
+                                                     object1 );
+            return !ShadowProxyUtils.contains( col,
+                                               value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object object = context.declaration.getExtractor().getValue( workingMemory,
+                                                                               left );
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = ((ObjectVariableContextEntry) context).right;
+            return !ShadowProxyUtils.contains( col,
+                                               value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object object = ((ObjectVariableContextEntry) context).left;
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = context.extractor.getValue( workingMemory,
+                                                             right );
+            return !ShadowProxyUtils.contains( col,
+                                               value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object object = extractor2.getValue( workingMemory,
+                                                       object2 );
+            if ( object == null ) {
+                return false;
+            } else if ( !(object instanceof Collection) ) {
+                throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
+            }
+            final Collection col = (Collection) object;
+            final Object value = extractor1.getValue( workingMemory,
+                                                      object1 );
+            return !ShadowProxyUtils.contains( col,
+                                               value );
+        }
+
+        public abstract String toString();
+    }
+
+    static class BigDecimalMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalMemberOfEvaluator();
+
+        private BigDecimalMemberOfEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "BigDecimal memberOf";
+        }
+    }
+
+    static class BigDecimalNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigDecimalNotMemberOfEvaluator();
+
+        private BigDecimalNotMemberOfEvaluator() {
+            super( ValueType.BIG_DECIMAL_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "BigDecimal not memberOf";
+        }
+    }
+
+    static class BigIntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerMemberOfEvaluator();
+
+        private BigIntegerMemberOfEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "BigInteger memberOf";
+        }
+    }
+
+    static class BigIntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BigIntegerNotMemberOfEvaluator();
+
+        private BigIntegerNotMemberOfEvaluator() {
+            super( ValueType.BIG_INTEGER_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "BigInteger not memberOf";
+        }
+    }
+
+    static class BooleanMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BooleanMemberOfEvaluator();
+
+        private BooleanMemberOfEvaluator() {
+            super( ValueType.PBOOLEAN_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Boolean memberOf";
+        }
+    }
+
+    static class BooleanNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new BooleanNotMemberOfEvaluator();
+
+        private BooleanNotMemberOfEvaluator() {
+            super( ValueType.PBOOLEAN_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Boolean not memberOf";
+        }
+    }
+
+    static class ByteMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteMemberOfEvaluator();
+
+        private ByteMemberOfEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Byte memberOf";
+        }
+    }
+
+    static class ByteNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ByteNotMemberOfEvaluator();
+
+        private ByteNotMemberOfEvaluator() {
+            super( ValueType.PBYTE_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Byte not memberOf";
+        }
+    }
+
+    static class CharacterMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterMemberOfEvaluator();
+
+        private CharacterMemberOfEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Character memberOf";
+        }
+    }
+
+    static class CharacterNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new CharacterNotMemberOfEvaluator();
+
+        private CharacterNotMemberOfEvaluator() {
+            super( ValueType.PCHAR_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Character not memberOf";
+        }
+    }
+
+    static class DateMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateMemberOfEvaluator();
+
+        private DateMemberOfEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Date memberOf";
+        }
+    }
+
+    static class DateNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DateNotMemberOfEvaluator();
+
+        private DateNotMemberOfEvaluator() {
+            super( ValueType.DATE_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Date not memberOf";
+        }
+    }
+
+    static class DoubleMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleMemberOfEvaluator();
+
+        private DoubleMemberOfEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Double memberOf";
+        }
+    }
+
+    static class DoubleNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new DoubleNotMemberOfEvaluator();
+
+        private DoubleNotMemberOfEvaluator() {
+            super( ValueType.PDOUBLE_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Double not memberOf";
+        }
+    }
+
+    static class FloatMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatMemberOfEvaluator();
+
+        private FloatMemberOfEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Float memberOf";
+        }
+    }
+
+    static class FloatNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new FloatNotMemberOfEvaluator();
+
+        private FloatNotMemberOfEvaluator() {
+            super( ValueType.PFLOAT_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Float not memberOf";
+        }
+    }
+
+    static class IntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerMemberOfEvaluator();
+
+        private IntegerMemberOfEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Integer memberOf";
+        }
+    }
+
+    static class IntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new IntegerNotMemberOfEvaluator();
+
+        private IntegerNotMemberOfEvaluator() {
+            super( ValueType.PINTEGER_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Integer not memberOf";
+        }
+    }
+
+    static class LongMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongMemberOfEvaluator();
+
+        private LongMemberOfEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Long memberOf";
+        }
+    }
+
+    static class LongNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new LongNotMemberOfEvaluator();
+
+        private LongNotMemberOfEvaluator() {
+            super( ValueType.PLONG_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Long not memberOf";
+        }
+    }
+
+    static class ObjectContainsEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectContainsEvaluator();
+
+        private ObjectContainsEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   CONTAINS );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value = object2.getValue();
+            final Collection col = (Collection) extractor.getValue( workingMemory,
+                                                                    object1 );
+            return (col == null) ? false : ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
+            return (col == null) ? false : ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = ((ObjectVariableContextEntry) context).left;
+            final Collection col = (Collection) context.extractor.getValue( workingMemory,
+                                                                            right );
+            return (col == null) ? false : ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value = extractor2.getValue( workingMemory,
+                                                      object2 );
+            final Collection col = (Collection) extractor1.getValue( workingMemory,
+                                                                     object1 );
+            return (col == null) ? false : ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public String toString() {
+            return "Object contains";
+        }
+    }
+
+    static class ObjectExcludesEvaluator extends BaseEvaluator {
+        /**
+         * 
+         */
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectExcludesEvaluator();
+
+        private ObjectExcludesEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   EXCLUDES );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1,
+                                final FieldValue object2) {
+            final Object value = object2.getValue();
+            final Collection col = (Collection) extractor.getValue( workingMemory,
+                                                                    object1 );
+            return (col == null) ? true : !ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context,
+                                           final Object left) {
+            final Object value = context.declaration.getExtractor().getValue( workingMemory,
+                                                                              left );
+            final Collection col = (Collection) ((ObjectVariableContextEntry) context).right;
+            return (col == null) ? true : !ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context,
+                                          final Object right) {
+            final Object value = ((ObjectVariableContextEntry) context).left;
+            final Collection col = (Collection) context.extractor.getValue( workingMemory,
+                                                                            right );
+            return (col == null) ? true : !ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2,
+                                final Object object2) {
+            final Object value = extractor2.getValue( workingMemory,
+                                                      object2 );
+            final Collection col = (Collection) extractor1.getValue( workingMemory,
+                                                                     object1 );
+            return (col == null) ? true : !ShadowProxyUtils.contains( col,
+                                                                      value );
+        }
+
+        public String toString() {
+            return "Object excludes";
+        }
+    }
+
+    static class ObjectMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectMemberOfEvaluator();
+
+        private ObjectMemberOfEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Object memberOf";
+        }
+    }
+
+    static class ObjectNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ObjectNotMemberOfEvaluator();
+
+        private ObjectNotMemberOfEvaluator() {
+            super( ValueType.OBJECT_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Object not memberOf";
+        }
+    }
+
+    static class ShortMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ShortMemberOfEvaluator();
+
+        private ShortMemberOfEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "Short memberOf";
+        }
+    }
+
+    static class ShortNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new ShortNotMemberOfEvaluator();
+
+        private ShortNotMemberOfEvaluator() {
+            super( ValueType.PSHORT_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "Short not memberOf";
+        }
+    }
+
+    static class StringMemberOfEvaluator extends BaseMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringMemberOfEvaluator();
+
+        private StringMemberOfEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   MEMBEROF );
+        }
+
+        public String toString() {
+            return "String memberOf";
+        }
+    }
+
+    static class StringNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringNotMemberOfEvaluator();
+
+        private StringNotMemberOfEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   NOT_MEMBEROF );
+        }
+
+        public String toString() {
+            return "String not memberOf";
+        }
+    }
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ShortFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,434 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.LongVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-
-public class ShortFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new ShortFactory();
-
-    private ShortFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( ShortFactory.INSTANCE == null ) {
-            ShortFactory.INSTANCE = new ShortFactory();
-        }
-        return ShortFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return ShortEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return ShortNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS ) {
-            return ShortLessEvaluator.INSTANCE;
-        } else if ( operator == Operator.LESS_OR_EQUAL ) {
-            return ShortLessOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER ) {
-            return ShortGreaterEvaluator.INSTANCE;
-        } else if ( operator == Operator.GREATER_OR_EQUAL ) {
-            return ShortGreaterOrEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return ShortMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return ShortNotMemberOfEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for ShortEvaluator" );
-        }
-    }
-
-    static class ShortEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortEqualEvaluator();
-
-        private ShortEqualEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return object2.isNull();
-            } else if ( object2.isNull() ) {
-                return false;
-            }
-            
-            return extractor.getShortValue( workingMemory, object1 ) == object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return false;
-            }
-            
-            return context.declaration.getExtractor().getShortValue( workingMemory, left ) == ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right )) {
-                return context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return false;
-            }
-            
-            return ((LongVariableContextEntry) context).left == context.extractor.getShortValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return false;
-            }
-            
-            return extractor1.getShortValue( workingMemory, object1 ) == extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Short ==";
-        }
-    }
-
-    static class ShortNotEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortNotEqualEvaluator();
-
-        private ShortNotEqualEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if ( extractor.isNullValue( workingMemory, object1 ) ) {
-                return !object2.isNull();
-            } else if ( object2.isNull() ) {
-                return true;
-            }
-            
-            return extractor.getShortValue( workingMemory, object1 ) != object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if ( context.declaration.getExtractor().isNullValue( workingMemory, left ) ) {
-                return !context.isRightNull();
-            } else if ( context.isRightNull() ) {
-                return true;
-            }
-            
-            return context.declaration.getExtractor().getShortValue( workingMemory, left ) != ((LongVariableContextEntry) context).right;
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if ( context.extractor.isNullValue( workingMemory, right ) ) {
-                return !context.isLeftNull();
-            } else if ( context.isLeftNull() ) {
-                return true;
-            }
-            
-            return ((LongVariableContextEntry) context).left != context.extractor.getShortValue( workingMemory, right );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if (extractor1.isNullValue( workingMemory, object1 )) {
-                return !extractor2.isNullValue( workingMemory, object2 );
-            } else if (extractor2.isNullValue( workingMemory, object2 )) {
-                return true;
-            }
-            
-            return extractor1.getShortValue( workingMemory, object1 ) != extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Short !=";
-        }
-    }
-
-    static class ShortLessEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortLessEvaluator();
-
-        private ShortLessEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.LESS );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getShortValue( workingMemory, object1 ) < object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right < context.declaration.getExtractor().getShortValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getShortValue( workingMemory, right ) < ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getShortValue( workingMemory, object1 ) < extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Short <";
-        }
-    }
-
-    static class ShortLessOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortLessOrEqualEvaluator();
-
-        private ShortLessOrEqualEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.LESS_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getShortValue( workingMemory, object1 ) <= object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right <= context.declaration.getExtractor().getShortValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getShortValue( workingMemory, right ) <= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getShortValue( workingMemory, object1 ) <= extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Boolean <=";
-        }
-    }
-
-    static class ShortGreaterEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortGreaterEvaluator();
-
-        private ShortGreaterEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.GREATER );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getShortValue( workingMemory, object1 ) > object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right > context.declaration.getExtractor().getShortValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getShortValue( workingMemory, right ) > ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getShortValue( workingMemory, object1 ) > extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Short >";
-        }
-    }
-
-    static class ShortGreaterOrEqualEvaluator extends BaseEvaluator {
-        /**
-         * 
-         */
-        private static final long      serialVersionUID = 400L;
-        private static final Evaluator INSTANCE         = new ShortGreaterOrEqualEvaluator();
-
-        private ShortGreaterOrEqualEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.GREATER_OR_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            if( extractor.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor.getShortValue( workingMemory, object1 ) >= object2.getShortValue();
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            if( context.rightNull ) {
-                return false;
-            }
-            return ((LongVariableContextEntry) context).right >= context.declaration.getExtractor().getShortValue( workingMemory, left );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            if( context.extractor.isNullValue( workingMemory, right ) ) {
-                return false;
-            }
-            return context.extractor.getShortValue( workingMemory, right ) >= ((LongVariableContextEntry) context).left;
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            if( extractor1.isNullValue( workingMemory, object1 ) ) {
-                return false;
-            }
-            return extractor1.getShortValue( workingMemory, object1 ) >= extractor2.getShortValue( workingMemory, object2 );
-        }
-
-        public String toString() {
-            return "Short >=";
-        }
-    }
-
-    static class ShortMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ShortMemberOfEvaluator();
-
-        private ShortMemberOfEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "Short memberOf";
-        }
-    }
-
-    static class ShortNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new ShortNotMemberOfEvaluator();
-
-        private ShortNotMemberOfEvaluator() {
-            super( ValueType.PSHORT_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "Short not memberOf";
-        }
-    }
-    
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.base.evaluators;
+
+import org.drools.base.BaseEvaluator;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.Extractor;
+import org.drools.spi.FieldValue;
+import org.mvel.Soundex;
+
+/**
+ * This class defines the soundslike evaluator
+ * 
+ * @author etirelli
+ */
+public class SoundslikeEvaluatorsDefinition implements EvaluatorDefinition {
+    
+    public static final Operator  SOUNDSLIKE       = Operator.addOperatorToRegistry( "soundslike",
+                                                                                     false );
+    public static final Operator  NOT_SOUNDSLIKE   = Operator.addOperatorToRegistry( "soundslike",
+                                                                                     true );
+    
+    private static final String[] SUPPORTED_IDS = { SOUNDSLIKE.getOperatorString() };
+    private EvaluatorCache evaluators = new EvaluatorCache() {
+        private static final long serialVersionUID = 4782368623L;
+        {
+            addEvaluator( ValueType.STRING_TYPE,        SOUNDSLIKE,         StringSoundsLikeEvaluator.INSTANCE );
+            addEvaluator( ValueType.STRING_TYPE,        NOT_SOUNDSLIKE,     StringNotSoundsLikeEvaluator.INSTANCE );
+        }
+    };
+    
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    /**
+     * @inheridDoc
+     */
+    public Evaluator getEvaluator(ValueType type,
+                                  Operator operator,
+                                  String parameterText) {
+        return this.evaluators.getEvaluator( type,
+                                             operator );
+    }
+
+    public Evaluator getEvaluator(final ValueType type,
+                                  final String operatorId,
+                                  final boolean isNegated,
+                                  final String parameterText) {
+        return this.evaluators.getEvaluator( type, 
+                                             Operator.determineOperator( operatorId, 
+                                                                         isNegated ) );
+    }
+
+    public String[] getEvaluatorIds() {
+        return SUPPORTED_IDS;
+    }
+
+    public boolean isNegatable() {
+        return true;
+    }
+
+    public boolean operatesOnFactHandles() {
+        return false;
+    }
+
+    public boolean supportsType(ValueType type) {
+        return this.evaluators.supportsType( type );
+    }
+    
+    /*  *********************************************************
+     *           Evaluator Implementations
+     *  *********************************************************
+     */
+    static class StringSoundsLikeEvaluator extends BaseEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringSoundsLikeEvaluator();
+
+        private StringSoundsLikeEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   SOUNDSLIKE );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
+            final String value2 = (String) object2.getValue();
+            if ( value1 == null ) {
+                return false;
+            }
+
+            return Soundex.soundex( value1 ).equals(  Soundex.soundex(value2) );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final String value = (String) ((ObjectVariableContextEntry) context).right;
+            if ( value == null ) {
+                return false;
+            }
+            return Soundex.soundex( value ).equals( Soundex.soundex((String) context.declaration.getExtractor().getValue( workingMemory, left )) );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
+            if ( value == null ) {
+                return false;
+            }
+            return Soundex.soundex(value).equals( Soundex.soundex((String) ((ObjectVariableContextEntry) context).left ));
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return Soundex.soundex( ((String) value1)).equals( Soundex.soundex( (String) value2 ));
+        }
+
+        public String toString() {
+            return "Strings sound alike";
+        }
+    }
+    
+    static class StringNotSoundsLikeEvaluator extends BaseEvaluator {
+
+        private static final long     serialVersionUID = 400L;
+        public final static Evaluator INSTANCE         = new StringNotSoundsLikeEvaluator();
+
+        private StringNotSoundsLikeEvaluator() {
+            super( ValueType.STRING_TYPE,
+                   NOT_SOUNDSLIKE );
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor,
+                                final Object object1, final FieldValue object2) {
+            final String value1 = (String) extractor.getValue( workingMemory, object1 );
+            final String value2 = (String) object2.getValue();
+            if ( value1 == null ) {
+                return false;
+            }
+
+            return ! Soundex.soundex( value1 ).equals(  Soundex.soundex(value2) );
+        }
+
+        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+                                           final VariableContextEntry context, final Object left) {
+            final String value = (String) ((ObjectVariableContextEntry) context).right;
+            if ( value == null ) {
+                return false;
+            }
+            return ! Soundex.soundex( value ).equals( Soundex.soundex((String) context.declaration.getExtractor().getValue( workingMemory, left )) );
+        }
+
+        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+                                          final VariableContextEntry context, final Object right) {
+            final String value = (String) context.extractor.getValue( workingMemory, right );
+            if ( value == null ) {
+                return false;
+            }
+            return ! Soundex.soundex(value).equals( Soundex.soundex((String) ((ObjectVariableContextEntry) context).left ));
+        }
+
+        public boolean evaluate(InternalWorkingMemory workingMemory,
+                                final Extractor extractor1,
+                                final Object object1,
+                                final Extractor extractor2, final Object object2) {
+            final Object value1 = extractor1.getValue( workingMemory, object1 );
+            final Object value2 = extractor2.getValue( workingMemory, object2 );
+            if ( value1 == null ) {
+                return false;
+            }
+            return ! Soundex.soundex( ((String) value1)).equals( Soundex.soundex( (String) value2 ));
+        }
+
+        public String toString() {
+            return "Strings not sound alike";
+        }
+    }
+    
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StringFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,395 +0,0 @@
-package org.drools.base.evaluators;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.base.BaseEvaluator;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
-import org.drools.rule.VariableRestriction.VariableContextEntry;
-import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldValue;
-import org.mvel.Soundex;
-
-/**
- * This is the misc "bucket" evaluator factory for objects.
- * It is fairly limited in operations,
- * and what operations are available are dependent on the exact type.
- *
- * @author Michael Neale
- */
-public class StringFactory
-    implements
-    EvaluatorFactory {
-
-    private static final long       serialVersionUID = 400L;
-    private static EvaluatorFactory INSTANCE         = new StringFactory();
-
-    private StringFactory() {
-
-    }
-
-    public static EvaluatorFactory getInstance() {
-        if ( StringFactory.INSTANCE == null ) {
-            StringFactory.INSTANCE = new StringFactory();
-        }
-        return StringFactory.INSTANCE;
-    }
-
-    public Evaluator getEvaluator(final Operator operator) {
-        if ( operator == Operator.EQUAL ) {
-            return StringEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_EQUAL ) {
-            return StringNotEqualEvaluator.INSTANCE;
-        } else if ( operator == Operator.MATCHES ) {
-            return StringMatchesEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOT_MATCHES ) {
-            return StringNotMatchesEvaluator.INSTANCE;
-        } else if ( operator == Operator.MEMBEROF ) {
-            return StringMemberOfEvaluator.INSTANCE;
-        } else if ( operator == Operator.NOTMEMBEROF ) {
-            return StringNotMemberOfEvaluator.INSTANCE;
-        } else if (operator == Operator.SOUNDSLIKE ){
-            return StringSoundsLikeEvaluator.INSTANCE;
-        } else {
-            throw new RuntimeException( "Operator '" + operator + "' does not exist for StringEvaluator" );
-        }
-    }
-
-    static class StringEqualEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringEqualEvaluator();
-
-        private StringEqualEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right == null;
-            }
-            return value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value == null;
-            }
-            return ((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 == null;
-            }
-            return value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "String ==";
-        }
-
-    }
-
-    static class StringNotEqualEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringNotEqualEvaluator();
-
-        private StringNotEqualEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.NOT_EQUAL );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final Object value1 = extractor.getValue( workingMemory, object1 );
-            final Object value2 = object2.getValue();
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final Object value = context.declaration.getExtractor().getValue( workingMemory, left );
-            if ( value == null ) {
-                return ((ObjectVariableContextEntry) context).right != null;
-            }
-            return !value.equals( ((ObjectVariableContextEntry) context).right );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final Object value = context.extractor.getValue( workingMemory, right );
-            if ( ((ObjectVariableContextEntry) context).left == null ) {
-                return value != null;
-            }
-            return !((ObjectVariableContextEntry) context).left.equals( value );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return value2 != null;
-            }
-            return !value1.equals( value2 );
-        }
-
-        public String toString() {
-            return "String !=";
-        }
-    }
-
-    static class StringMatchesEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringMatchesEvaluator();
-
-        private StringMatchesEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.MATCHES );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final String value1 = (String) extractor.getValue( workingMemory, object1 );
-            final String value2 = (String) object2.getValue();
-            if ( value1 == null ) {
-                return false;
-            }
-            return value1.matches( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final String value = (String) ((ObjectVariableContextEntry) context).right;
-            if ( value == null ) {
-                return false;
-            }
-            return value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final String value = (String) context.extractor.getValue( workingMemory, right );
-            if ( value == null ) {
-                return false;
-            }
-            return value.matches( (String) ((ObjectVariableContextEntry) context).left );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return false;
-            }
-            return ((String) value1).matches( (String) value2 );
-        }
-
-        public String toString() {
-            return "String matches";
-        }
-    }
-
-    static class StringNotMatchesEvaluator extends BaseEvaluator {
-        /**
-         *
-         */
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringNotMatchesEvaluator();
-
-        private StringNotMatchesEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.NOT_MATCHES );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final String value1 = (String) extractor.getValue( workingMemory, object1 );
-            final String value2 = (String) object2.getValue();
-            if ( value1 == null ) {
-                return false;
-            }
-            return ! value1.matches( value2 );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final String value = (String) ((ObjectVariableContextEntry) context).right;
-            if ( value == null ) {
-                return false;
-            }
-            return ! value.matches( (String) context.declaration.getExtractor().getValue( workingMemory, left ) );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final String value = (String) context.extractor.getValue( workingMemory, right );
-            if ( value == null ) {
-                return false;
-            }
-            return ! value.matches( (String) ((ObjectVariableContextEntry) context).left );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return false;
-            }
-            return ! ((String) value1).matches( (String) value2 );
-        }
-
-        public String toString() {
-            return "String not matches";
-        }
-    }
-
-    static class StringMemberOfEvaluator extends BaseMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringMemberOfEvaluator();
-
-        private StringMemberOfEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.MEMBEROF );
-        }
-
-        public String toString() {
-            return "String memberOf";
-        }
-    }
-
-    static class StringNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringNotMemberOfEvaluator();
-
-        private StringNotMemberOfEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.NOTMEMBEROF );
-        }
-
-        public String toString() {
-            return "String not memberOf";
-        }
-    }
-
-    static class StringSoundsLikeEvaluator extends BaseEvaluator {
-
-        private static final long     serialVersionUID = 400L;
-        public final static Evaluator INSTANCE         = new StringSoundsLikeEvaluator();
-
-        private StringSoundsLikeEvaluator() {
-            super( ValueType.STRING_TYPE,
-                   Operator.SOUNDSLIKE );
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
-                                final Object object1, final FieldValue object2) {
-            final String value1 = (String) extractor.getValue( workingMemory, object1 );
-            final String value2 = (String) object2.getValue();
-            if ( value1 == null ) {
-                return false;
-            }
-
-            return Soundex.soundex( value1 ).equals(  Soundex.soundex(value2) );
-        }
-
-        public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-                                           final VariableContextEntry context, final Object left) {
-            final String value = (String) ((ObjectVariableContextEntry) context).right;
-            if ( value == null ) {
-                return false;
-            }
-            return Soundex.soundex( value ).equals( Soundex.soundex((String) context.declaration.getExtractor().getValue( workingMemory, left )) );
-        }
-
-        public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-                                          final VariableContextEntry context, final Object right) {
-            final String value = (String) context.extractor.getValue( workingMemory, right );
-            if ( value == null ) {
-                return false;
-            }
-            return Soundex.soundex(value).equals( Soundex.soundex((String) ((ObjectVariableContextEntry) context).left ));
-        }
-
-        public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
-                                final Object object1,
-                                final Extractor extractor2, final Object object2) {
-            final Object value1 = extractor1.getValue( workingMemory, object1 );
-            final Object value2 = extractor2.getValue( workingMemory, object2 );
-            if ( value1 == null ) {
-                return false;
-            }
-            return Soundex.soundex( ((String) value1)).equals( Soundex.soundex( (String) value2 ));
-        }
-
-        public String toString() {
-            return "Strings sound alike";
-        }
-    }
-
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCalendarCoercion.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCalendarCoercion.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCalendarCoercion.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -2,7 +2,7 @@
 
 import java.util.Calendar;
 
-import org.drools.base.evaluators.DateFactory;
+import org.drools.util.DateUtils;
 import org.mvel.ConversionHandler;
 
 public class MVELCalendarCoercion implements ConversionHandler {
@@ -18,7 +18,7 @@
     public Object convertFrom(Object o) {
         if (o instanceof String) {
             Calendar cal = Calendar.getInstance();
-            cal.setTime( DateFactory.parseDate( (String) o) );
+            cal.setTime( DateUtils.parseDate( (String) o) );
             return cal;
         } else {
             return o;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELDateCoercion.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELDateCoercion.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELDateCoercion.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -2,7 +2,7 @@
 
 import java.util.Date;
 
-import org.drools.base.evaluators.DateFactory;
+import org.drools.util.DateUtils;
 import org.mvel.ConversionHandler;
 
 public class MVELDateCoercion implements ConversionHandler {
@@ -17,7 +17,7 @@
 
     public Object convertFrom(Object o) {
         if (o instanceof String) {
-            return DateFactory.parseDate( (String) o);
+            return DateUtils.parseDate( (String) o);
         } else {
             return o;
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractFactHandleFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import org.drools.WorkingMemory;
 import org.drools.spi.FactHandleFactory;
 import org.drools.util.PrimitiveLongStack;
 
@@ -39,24 +40,32 @@
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newFactHandle()
      */
-    public final InternalFactHandle newFactHandle(final Object object) {
+    public final InternalFactHandle newFactHandle( final Object object, final boolean isEvent, final WorkingMemory workingMemory ) {
         if ( !this.factHandlePool.isEmpty() ) {
             return newFactHandle( this.factHandlePool.pop(),
-                                  object );
+                                  object, 
+                                  isEvent,
+                                  workingMemory );
         }
 
         return newFactHandle( this.id++,
-                              object );
+                              object,
+                              isEvent,
+                              workingMemory );
     }
 
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
      */
     protected final InternalFactHandle newFactHandle(final long id,
-                                                     final Object object) {
+                                                     final Object object,
+                                                     final boolean isEvent, 
+                                                     final WorkingMemory workingMemory ) {
         return newFactHandle( id,
                               object,
-                              this.counter++ );
+                              this.counter++,
+                              isEvent,
+                              workingMemory );
     }
 
     /* (non-Javadoc)
@@ -64,7 +73,9 @@
      */
     protected abstract InternalFactHandle newFactHandle(final long id,
                                                         final Object object,
-                                                        final long recency);
+                                                        final long recency,
+                                                        final boolean isEvent, 
+                                                        final WorkingMemory workingMemory );
 
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#increaseFactHandleRecency(org.drools.FactHandle)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -49,6 +49,7 @@
 import org.drools.objenesis.Objenesis;
 import org.drools.objenesis.ObjenesisStd;
 import org.drools.rule.CompositePackageClassLoader;
+import org.drools.rule.ImportDeclaration;
 import org.drools.rule.InvalidPatternException;
 import org.drools.rule.MapBackedClassLoader;
 import org.drools.rule.Package;
@@ -156,7 +157,7 @@
         this.packageClassLoader = new CompositePackageClassLoader( this.config.getClassLoader() );
         this.classLoader = new MapBackedClassLoader( this.config.getClassLoader() );
         this.packageClassLoader.addClassLoader( this.classLoader );
-        this.pkgs = new HashMap();
+        this.pkgs = new HashMap<String, Package>();
         this.processes = new HashMap();
         this.globals = new HashMap();
         this.statefulSessions = new ObjectHashSet();
@@ -448,7 +449,7 @@
     private void mergePackage(final Package pkg,
                               final Package newPkg) throws PackageIntegrationException {
         final Map globals = pkg.getGlobals();
-        final Set imports = pkg.getImports();
+        final Map<String, ImportDeclaration> imports = pkg.getImports();
 
         // First update the binary files
         // @todo: this probably has issues if you add classes in the incorrect order - functions, rules, invokers.
@@ -461,7 +462,7 @@
         }
 
         // Merge imports
-        imports.addAll( newPkg.getImports() );
+        imports.putAll( newPkg.getImports() );
 
         // Add invokers
         compilationData.putAllInvokers( newCompilationData.getInvokers() );
@@ -777,6 +778,15 @@
         // since the event support is thread-safe, no need for locks... right?
         return this.eventSupport.getEventListeners();
     }
+    
+    public boolean isEvent( Class clazz ) {
+        for( Package pkg : this.pkgs.values() ) {
+            if( pkg.isEvent( clazz ) ) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     public static class ReloadPackageCompilationData
         implements

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -53,7 +53,11 @@
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
+import org.drools.facttemplates.Fact;
+import org.drools.reteoo.ClassObjectTypeConf;
+import org.drools.reteoo.FactTemplateTypeConf;
 import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.ObjectTypeConf;
 import org.drools.rule.Declaration;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
@@ -70,6 +74,7 @@
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.GlobalResolver;
 import org.drools.spi.PropagationContext;
+import org.drools.temporal.SessionClock;
 import org.drools.util.JavaIteratorAdapter;
 import org.drools.util.ObjectHashMap;
 import org.drools.util.PrimitiveLongMap;
@@ -90,76 +95,80 @@
     // ------------------------------------------------------------
     // Constants
     // ------------------------------------------------------------
-    protected static final Class[]                  ADD_REMOVE_PROPERTY_CHANGE_LISTENER_ARG_TYPES = new Class[]{PropertyChangeListener.class};
+    protected static final Class[]         ADD_REMOVE_PROPERTY_CHANGE_LISTENER_ARG_TYPES = new Class[]{PropertyChangeListener.class};
 
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
-    protected long                                  id;
+    protected long                         id;
 
     /** The arguments used when adding/removing a property change listener. */
-    protected final Object[]                        addRemovePropertyChangeListenerArgs           = new Object[]{this};
+    protected final Object[]               addRemovePropertyChangeListenerArgs           = new Object[]{this};
 
     /** The actual memory for the <code>JoinNode</code>s. */
-    protected final PrimitiveLongMap                nodeMemories                                  = new PrimitiveLongMap( 32,
-                                                                                                                          8 );
+    protected final PrimitiveLongMap       nodeMemories                                  = new PrimitiveLongMap( 32,
+                                                                                                                 8 );
     /** Object-to-handle mapping. */
-    private final ObjectHashMap                     assertMap;
-    private final ObjectHashMap                     identityMap;
+    private final ObjectHashMap            assertMap;
+    private final ObjectHashMap            identityMap;
 
-    protected Map                                   queryResults                                  = Collections.EMPTY_MAP;
+    protected Map                          queryResults                                  = Collections.EMPTY_MAP;
 
     /** Global values which are associated with this memory. */
-    protected GlobalResolver                        globalResolver;
+    protected GlobalResolver               globalResolver;
 
-    protected static final Object                   NULL                                          = new Serializable() {
-                                                                                                      private static final long serialVersionUID = 400L;
-                                                                                                  };
+    protected static final Object          NULL                                          = new Serializable() {
+                                                                                             private static final long serialVersionUID = 400L;
+                                                                                         };
 
     /** The eventSupport */
-    protected WorkingMemoryEventSupport             workingMemoryEventSupport                     = new WorkingMemoryEventSupport();
+    protected WorkingMemoryEventSupport    workingMemoryEventSupport                     = new WorkingMemoryEventSupport();
 
-    protected AgendaEventSupport                    agendaEventSupport                            = new AgendaEventSupport();
+    protected AgendaEventSupport           agendaEventSupport                            = new AgendaEventSupport();
 
-    protected RuleFlowEventSupport                  ruleFlowEventSupport                          = new RuleFlowEventSupport();
+    protected RuleFlowEventSupport         ruleFlowEventSupport                          = new RuleFlowEventSupport();
 
     /** The <code>RuleBase</code> with which this memory is associated. */
-    protected transient InternalRuleBase            ruleBase;
+    protected transient InternalRuleBase   ruleBase;
 
-    protected final FactHandleFactory               handleFactory;
+    protected final FactHandleFactory      handleFactory;
 
-    protected final TruthMaintenanceSystem          tms;
+    protected final TruthMaintenanceSystem tms;
 
     /** Rule-firing agenda. */
-    protected DefaultAgenda                         agenda;
+    protected DefaultAgenda                agenda;
 
-    protected final List                            actionQueue                                   = new ArrayList();
+    protected final List                   actionQueue                                   = new ArrayList();
 
-    protected final ReentrantLock                   lock                                          = new ReentrantLock();
+    protected final ReentrantLock          lock                                          = new ReentrantLock();
 
-    protected final boolean                         discardOnLogicalOverride;
+    protected final boolean                discardOnLogicalOverride;
 
-    protected long                                  propagationIdCounter;
+    protected long                         propagationIdCounter;
 
-    private final boolean                           maintainTms;
+    private final boolean                  maintainTms;
 
-    private final boolean                           sequential;
+    private final boolean                  sequential;
 
-    private List                                    liaPropagations                               = Collections.EMPTY_LIST;
+    private List                           liaPropagations                               = Collections.EMPTY_LIST;
 
     /** Flag to determine if a rule is currently being fired. */
-    protected boolean                               firing;
+    protected boolean                      firing;
 
-    protected boolean                               halt;
+    protected boolean                      halt;
 
-    private Map 						   processInstances								 = new HashMap();
-    
+    private Map                            processInstances                              = new HashMap();
+
     private int                            processCounter;
-    
-    private WorkItemManager            taskInstanceManager;
 
-    private TimeMachine 							timeMachine = new TimeMachine();
+    private WorkItemManager                taskInstanceManager;
 
+    private TimeMachine                    timeMachine                                   = new TimeMachine();
+
+    private Map<Object, ObjectTypeConf>    typeConfMap;
+
+    private SessionClock                   sessionClock;
+
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -204,7 +213,10 @@
         } else {
             this.discardOnLogicalOverride = false;
         }
-        this.taskInstanceManager = new WorkItemManager(this);
+
+        this.taskInstanceManager = new WorkItemManager( this );
+
+        this.typeConfMap = new HashMap<Object, ObjectTypeConf>();
     }
 
     // ------------------------------------------------------------
@@ -392,7 +404,7 @@
     public long getId() {
         return this.id;
     }
-    
+
     public void setId(long id) {
         this.id = id;
     }
@@ -716,10 +728,14 @@
             return null;
         }
 
+        ObjectTypeConf typeConf = getObjectTypeConf( object );
+
         InternalFactHandle handle = null;
 
         if ( isSequential() ) {
-            handle = this.handleFactory.newFactHandle( object );
+            handle = this.handleFactory.newFactHandle( object,
+                                                       typeConf.isEvent(),
+                                                       this );
             addHandleToMaps( handle );
             insert( handle,
                     object,
@@ -771,7 +787,9 @@
                 if ( key == null ) {
                     // key is also null, so treat as a totally new stated/logical
                     // assert
-                    handle = this.handleFactory.newFactHandle( object );
+                    handle = this.handleFactory.newFactHandle( object,
+                                                               typeConf.isEvent(),
+                                                               this );
                     addHandleToMaps( handle );
 
                     key = new EqualityKey( handle );
@@ -825,7 +843,9 @@
                         } else {
                             // override, then instantiate new handle for assertion
                             key.setStatus( EqualityKey.STATED );
-                            handle = this.handleFactory.newFactHandle( object );
+                            handle = this.handleFactory.newFactHandle( object,
+                                                                       typeConf.isEvent(),
+                                                                       this );
                             handle.setEqualityKey( key );
                             key.addFactHandle( handle );
                             addHandleToMaps( handle );
@@ -833,7 +853,9 @@
                         }
 
                     } else {
-                        handle = this.handleFactory.newFactHandle( object );
+                        handle = this.handleFactory.newFactHandle( object,
+                                                                   typeConf.isEvent(),
+                                                                   this );
                         addHandleToMaps( handle );
                         key.addFactHandle( handle );
                         handle.setEqualityKey( key );
@@ -860,7 +882,9 @@
                 if ( handle != null ) {
                     return handle;
                 }
-                handle = this.handleFactory.newFactHandle( object );
+                handle = this.handleFactory.newFactHandle( object,
+                                                           typeConf.isEvent(),
+                                                           this );
                 addHandleToMaps( handle );
 
             }
@@ -1420,35 +1444,36 @@
             processInstance.setWorkingMemory( this );
             processInstance.setProcess( process );
             processInstance.setId( ++processCounter );
-            processInstances.put(new Long(processInstance.getId()), processInstance);
-            getRuleFlowEventSupport().fireBeforeRuleFlowProcessStarted(
-                    processInstance, this);
+            processInstances.put( new Long( processInstance.getId() ),
+                                  processInstance );
+            getRuleFlowEventSupport().fireBeforeRuleFlowProcessStarted( processInstance,
+                                                                        this );
             processInstance.start();
-            getRuleFlowEventSupport().fireAfterRuleFlowProcessStarted(
-                    processInstance, this);
+            getRuleFlowEventSupport().fireAfterRuleFlowProcessStarted( processInstance,
+                                                                       this );
 
             return processInstance;
         } else {
             throw new IllegalArgumentException( "Unknown process type: " + process.getClass() );
         }
     }
-    
+
     public Collection getProcessInstances() {
-    	return Collections.unmodifiableCollection(processInstances.values());
+        return Collections.unmodifiableCollection( processInstances.values() );
     }
-    
+
     public ProcessInstance getProcessInstance(long id) {
-        return (ProcessInstance) processInstances.get(new Long(id));
+        return (ProcessInstance) processInstances.get( new Long( id ) );
     }
-    
+
     public void removeProcessInstance(ProcessInstance processInstance) {
-    	processInstances.remove(processInstance);
+        processInstances.remove( processInstance );
     }
-    
+
     public WorkItemManager getWorkItemManager() {
         return taskInstanceManager;
     }
-    
+
     public List iterateObjectsToList() {
         List result = new ArrayList();
         Iterator iterator = iterateObjects();
@@ -1489,16 +1514,63 @@
     /**
      * The time machine tells you what time it is.
      */
-	public TimeMachine getTimeMachine() {
-		return timeMachine;
-	}
+    public TimeMachine getTimeMachine() {
+        return timeMachine;
+    }
 
-	/**
-	 * The time machine defaults to returning the current time when asked. However, you can use tell it to go back in time.
-	 * @param timeMachine
-	 */
-	public void setTimeMachine(TimeMachine timeMachine) {
-		this.timeMachine = timeMachine;
-	}
+    /**
+     * The time machine defaults to returning the current time when asked. However, you can use tell it to go back in time.
+     * @param timeMachine
+     */
+    public void setTimeMachine(TimeMachine timeMachine) {
+        this.timeMachine = timeMachine;
+    }
 
+    /**
+     * Returns the ObjectTypeConfiguration object for the given object
+     * or creates a new one if none is found in the cache
+     * 
+     * @param object
+     * @return
+     */
+    public ObjectTypeConf getObjectTypeConf(Object object) {
+        ObjectTypeConf objectTypeConf;
+
+        if ( object instanceof Fact ) {
+            String key = ((Fact) object).getFactTemplate().getName();
+            objectTypeConf = (ObjectTypeConf) this.typeConfMap.get( key );
+            if ( objectTypeConf == null ) {
+                objectTypeConf = new FactTemplateTypeConf( ((Fact) object).getFactTemplate(),
+                                                           this.ruleBase );
+                this.typeConfMap.put( key,
+                                      objectTypeConf );
+            }
+            object = key;
+        } else {
+            Class cls = null;
+            if ( object instanceof ShadowProxy ) {
+                cls = ((ShadowProxy) object).getShadowedObject().getClass();
+            } else {
+                cls = object.getClass();
+            }
+
+            objectTypeConf = (ObjectTypeConf) this.typeConfMap.get( cls );
+            if ( objectTypeConf == null ) {
+
+                final boolean isEvent = this.ruleBase.isEvent( cls );
+                objectTypeConf = new ClassObjectTypeConf( cls,
+                                                          isEvent,
+                                                          this.ruleBase );
+                this.typeConfMap.put( cls,
+                                      objectTypeConf );
+            }
+
+        }
+        return objectTypeConf;
+    }
+
+    public Map<Object, ObjectTypeConf> getObjectTypeConfMap() {
+        return this.typeConfMap;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,7 +17,7 @@
     public void updateFromFactHandle(InternalWorkingMemory workingMemory,
                                      InternalFactHandle handle);
 
-    public boolean isAllowedCachedLeft(Object object);
+    public boolean isAllowedCachedLeft(InternalFactHandle handle);
 
     public boolean isAllowedCachedRight(ReteTuple tuple);
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -30,11 +30,9 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Constraint;
-import org.drools.util.Entry;
-import org.drools.util.FactHashTable;
 import org.drools.util.FactHandleIndexHashTable;
+import org.drools.util.FactHashTable;
 import org.drools.util.FactList;
-import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
 import org.drools.util.TupleHashTable;
@@ -155,14 +153,14 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         // skip the indexed constraints
         LinkedListEntry entry = (LinkedListEntry) findNode( this.indexed );
 
         ContextEntry context = findContext( this.indexed );
         while ( entry != null ) {
             if ( !((BetaNodeFieldConstraint) entry.getObject()).isAllowedCachedLeft( context,
-                                                                                     object ) ) {
+                                                                                     handle ) ) {
                 return false;
             }
             entry = (LinkedListEntry) entry.getNext();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultFactHandle.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -52,10 +52,9 @@
 
     public DefaultFactHandle(final long id,
                              final Object object) {
-        this.id = id;
-        this.recency = id;
-        this.object = object;
-        this.objectHashCode = object.hashCode();
+        this( id,
+              object,
+              id );
     }
 
     /**
@@ -107,7 +106,7 @@
      * @see FactHandle
      */
     public String toExternalForm() {
-        return "[fid:" + this.id + ":" + this.recency + ":" + this.object + "]";
+        return "[fact fid:" + this.id + ":" + this.recency + ":" + this.object + "]";
     }
 
     /**
@@ -163,4 +162,12 @@
     public void setEqualityKey(final EqualityKey key) {
         this.key = key;
     }
+
+    /**
+     * Always returns false, since the DefaultFactHandle is
+     * only used for regular Facts, and not for Events
+     */
+    public boolean isEvent() {
+        return false;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DoubleBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -29,8 +29,8 @@
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.util.FactHandleIndexHashTable;
 import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
 import org.drools.util.FactList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
@@ -67,7 +67,7 @@
     public DoubleBetaConstraints(final BetaNodeFieldConstraint[] constraints,
                                  final RuleBaseConfiguration conf,
                                  final boolean disableIndexing) {
-        if ( disableIndexing || ( !conf.isIndexLeftBetaMemory() && !conf.isIndexRightBetaMemory() ) ) {
+        if ( disableIndexing || (!conf.isIndexLeftBetaMemory() && !conf.isIndexRightBetaMemory()) ) {
             this.indexed0 = false;
             this.indexed1 = false;
         } else {
@@ -115,7 +115,7 @@
         } else {
             return false;
         }
-    }   
+    }
 
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#updateFromTuple(org.drools.reteoo.ReteTuple)
@@ -142,10 +142,10 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         return (this.indexed0 || this.constraint0.isAllowedCachedLeft( this.context0,
-                                                                       object )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
-                                                                                                                                            object ));
+                                                                       handle )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
+                                                                                                                                            handle ));
     }
 
     /* (non-Javadoc)
@@ -160,7 +160,7 @@
     public boolean isIndexed() {
         return this.indexed0;
     }
-    
+
     public int getIndexCount() {
         int count = 0;
         if ( this.indexed0 ) {
@@ -168,9 +168,9 @@
         }
         if ( this.indexed1 ) {
             count++;
-        }    
-        return count;    
-    }    
+        }
+        return count;
+    }
 
     public boolean isEmpty() {
         return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EmptyBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -63,7 +63,7 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         return true;
     }
 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/common/EventFactHandle.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/EventFactHandle.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,117 @@
+package org.drools.common;
+
+import org.drools.FactHandle;
+
+public class EventFactHandle extends DefaultFactHandle {
+
+    private static final long serialVersionUID = 5997141759543399455L;
+    
+    private final long startTimestamp;
+    private final long duration;
+
+    // ----------------------------------------------------------------------
+    // Constructors
+    // ----------------------------------------------------------------------
+
+    public EventFactHandle() {
+        super();
+        this.startTimestamp = 0;
+        this.duration = 0;
+    }
+
+    public EventFactHandle(final long id,
+                           final Object object) {
+        super( id,
+               object );
+        this.startTimestamp = 0;
+        this.duration = 0;
+    }
+
+    /**
+     * Construct.
+     * 
+     * @param id
+     *            Handle id.
+     */
+    public EventFactHandle(final long id,
+                           final Object object,
+                           final long recency) {
+        super( id,
+               object,
+               recency );
+        this.startTimestamp = 0;
+        this.duration = 0;
+    }
+    
+    /**
+     * Creates a new event fact handle.
+     * 
+     * @param id this event fact handle ID
+     * @param object the event object encapsulated in this event fact handle
+     * @param recency the recency of this event fact handle
+     * @param timestamp the timestamp of the occurence of this event
+     * @param duration the duration of this event. May be 0 (zero) in case this is a primitive event.
+     */
+    public EventFactHandle( final long id, 
+                            final Object object,
+                            final long recency,
+                            final long timestamp,
+                            final long duration ) {
+        super( id,
+               object, 
+               recency );
+        this.startTimestamp = timestamp;
+        this.duration = duration;
+    }
+    
+    /**
+     * @see FactHandle
+     */
+    public String toExternalForm() {
+        return "[event fid:" + getId() + ":" + getRecency() + ":" + getObject() + "]";
+    }
+
+    /**
+     * @see Object
+     */
+    public String toString() {
+        return toExternalForm();
+    }
+
+    /**
+     * Always returns true, since the EventFactHandle is
+     * only used for Events, and not for regular Facts
+     */
+    public boolean isEvent() {
+        return true;
+    }
+
+    /**
+     * Returns the timestamp of the occurrence of this event.
+     * @return
+     */
+    public long getStartTimestamp() {
+        return startTimestamp;
+    }
+
+    /**
+     * Returns the duration of this event. In case this is a primitive event, 
+     * returns 0 (zero).
+     * 
+     * @return
+     */
+    public long getDuration() {
+        return duration;
+    }
+
+    /**
+     * Returns the end timestamp for this event. This is the same as:
+     * 
+     * startTimestamp + duration
+     * 
+     * @return
+     */
+    public long getEndTimestamp() {
+        return this.startTimestamp + this.duration;
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -62,8 +62,8 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
-        return ((InstanceEqualsConstraintContextEntry) context).left == object;
+                                       final InternalFactHandle handle) {
+        return ((InstanceEqualsConstraintContextEntry) context).left == handle.getObject();
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -58,8 +58,8 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
-        return ((InstanceNotEqualsConstraintContextEntry) context).left != object;
+                                       final InternalFactHandle handle) {
+        return ((InstanceNotEqualsConstraintContextEntry) context).left != handle.getObject();
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalFactHandle.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -42,4 +42,13 @@
     public boolean isShadowFact();
 
     public void setShadowFact(boolean shadowFact);
+    
+    /**
+     * Returns true if this FactHandle represents
+     * and Event or false if this FactHandle represents
+     * a regular Fact
+     * 
+     * @return
+     */
+    public boolean isEvent();
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -104,6 +104,14 @@
     public InternalWorkingMemory[] getWorkingMemories();
     
     public Process getProcess(String id);
+    
+    /**
+     * Returns true if clazz represents an Event class. False otherwise.
+     *  
+     * @param clazz
+     * @return
+     */
+    public boolean isEvent( Class clazz );
 
 	public Objenesis getObjenesis();
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,5 +1,6 @@
 package org.drools.common;
 
+import java.util.Map;
 import java.util.concurrent.locks.Lock;
 
 import org.drools.FactException;
@@ -9,6 +10,7 @@
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventSupport;
 import org.drools.reteoo.LIANodePropagation;
+import org.drools.reteoo.ObjectTypeConf;
 import org.drools.rule.Rule;
 import org.drools.rule.TimeMachine;
 import org.drools.ruleflow.common.instance.ProcessInstance;
@@ -71,4 +73,21 @@
 	public void setTimeMachine(TimeMachine tm);
     
     public void removeProcessInstance(ProcessInstance processInstance);
+    
+    /**
+     * Returns the ObjectTypeConfiguration object for the given object
+     * or creates a new one if none is found in the cache
+     * 
+     * @param object
+     * @return
+     */
+    public ObjectTypeConf getObjectTypeConf(Object object);
+    
+    /**
+     * Returns the Map<Object key, ObjectTypeConf conf> of object type
+     * confs in this working memory
+     *  
+     * @return
+     */
+    public Map<Object, ObjectTypeConf> getObjectTypeConfMap();
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/QuadroupleBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -29,8 +29,8 @@
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
+import org.drools.util.FactHandleIndexHashTable;
 import org.drools.util.FactHashTable;
-import org.drools.util.FactHandleIndexHashTable;
 import org.drools.util.FactList;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListEntry;
@@ -203,18 +203,18 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         //        return ( this.indexed0 || this.constraint0.isAllowedCachedLeft( context0,
         //                                                                       object ) ) && this.constraint1.isAllowedCachedLeft( context1,
         //                                                                                                       object ) && this.constraint2.isAllowedCachedLeft( context2,
         //                                                                                                                                                         object );
 
         return (this.indexed0 || this.constraint0.isAllowedCachedLeft( this.context0,
-                                                                       object )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
-                                                                                                                                            object )) && (this.indexed2 || this.constraint2.isAllowedCachedLeft( this.context2,
-                                                                                                                                                                                                                 object ))
+                                                                       handle )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
+                                                                                                                                            handle )) && (this.indexed2 || this.constraint2.isAllowedCachedLeft( this.context2,
+                                                                                                                                                                                                                 handle ))
                && (this.indexed3 || this.constraint3.isAllowedCachedLeft( this.context3,
-                                                                          object ));
+                                                                          handle ));
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/SingleBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -113,9 +113,9 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         return this.indexed || this.constraint.isAllowedCachedLeft( this.context,
-                                                                    object );
+                                                                    handle );
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TripleBetaConstraints.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -169,16 +169,16 @@
     /* (non-Javadoc)
      * @see org.drools.common.BetaNodeConstraints#isAllowedCachedLeft(java.lang.Object)
      */
-    public boolean isAllowedCachedLeft(final Object object) {
+    public boolean isAllowedCachedLeft(final InternalFactHandle handle) {
         //        return ( this.indexed0 || this.constraint0.isAllowedCachedLeft( context0,
         //                                                                       object ) ) && this.constraint1.isAllowedCachedLeft( context1,
         //                                                                                                       object ) && this.constraint2.isAllowedCachedLeft( context2,
         //                                                                                                                                                         object );
 
         return (this.indexed0 || this.constraint0.isAllowedCachedLeft( this.context0,
-                                                                       object )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
-                                                                                                                                            object )) && (this.indexed2 || this.constraint2.isAllowedCachedLeft( this.context2,
-                                                                                                                                                                                                                 object ));
+                                                                       handle )) && (this.indexed1 || this.constraint1.isAllowedCachedLeft( this.context1,
+                                                                                                                                            handle )) && (this.indexed2 || this.constraint2.isAllowedCachedLeft( this.context2,
+                                                                                                                                                                                                                 handle ));
     }
 
     /* (non-Javadoc)
@@ -194,7 +194,7 @@
     public boolean isIndexed() {
         return this.indexed0;
     }
-    
+
     public int getIndexCount() {
         int count = 0;
         if ( this.indexed0 ) {
@@ -205,9 +205,9 @@
         }
         if ( this.indexed2 ) {
             count++;
-        }   
-        return count;    
-    }  
+        }
+        return count;
+    }
 
     public boolean isEmpty() {
         return false;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -74,9 +74,9 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         // object MUST be a ReteTuple
-        final ReteTuple tuple = ((ReteTuple) object).getSubTuple( ((TupleStartEqualsConstraintContextEntry) context).compareSize );
+        final ReteTuple tuple = ((ReteTuple) handle.getObject()).getSubTuple( ((TupleStartEqualsConstraintContextEntry) context).compareSize );
         return ((TupleStartEqualsConstraintContextEntry) context).left.equals( tuple );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateObjectType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.spi.ObjectType;
 
@@ -42,11 +41,13 @@
     /** FieldTemplate. */
     protected FactTemplate    factTemplate;
 
+    private boolean           isEvent;
+
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
 
-    /**
+     /**
      * Construct.
      * 
      * @param objectTypeClass
@@ -90,27 +91,35 @@
             return false;
         }
     }
-    
+
     public boolean isAssignableFrom(Object object) {
         return this.factTemplate.equals( object );
-    }    
-    
+    }
+
     public boolean isAssignableFrom(ObjectType objectType) {
-        if ( ! ( objectType instanceof FactTemplateObjectType ) ) {
+        if ( !(objectType instanceof FactTemplateObjectType) ) {
             return false;
         } else {
-            return this.factTemplate.equals(  ((FactTemplateObjectType) objectType).getFactTemplate() );
+            return this.factTemplate.equals( ((FactTemplateObjectType) objectType).getFactTemplate() );
         }
-    }     
+    }
 
     public ValueType getValueType() {
         return ValueType.FACTTEMPLATE_TYPE;
     }
-    
-    public String toString() {
-        return "[ClassObjectType class=" + this.factTemplate.getName() + "]";
+
+    public boolean isEvent() {
+        return isEvent;
     }
 
+    public void setEvent(boolean isEvent) {
+        this.isEvent = isEvent;
+    }
+
+   public String toString() {
+        return "[FactTemplateObjectType "+( this.isEvent ? "event=" : "template=") + this.factTemplate.getName() + "]";
+    }
+
     /**
      * Determine if another object is equal to this.
      * 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -119,7 +119,7 @@
 
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
             InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 if ( this.unwrapRightObject ) {
                     // if there is a subnetwork, handle must be unwrapped
                     ReteTuple tuple = (ReteTuple) handle.getObject(); 
@@ -150,8 +150,10 @@
 
         // First alpha node filters
         boolean isAllowed = true;
+        final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( result, false, workingMemory ); // so far, result is not an event
+
         for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
-            if ( !this.resultConstraints[i].isAllowed( result,
+            if ( !this.resultConstraints[i].isAllowed( handle,
                                                        workingMemory ) ) {
                 isAllowed = false;
                 break;
@@ -160,15 +162,18 @@
         if ( isAllowed ) {
             this.resultBinder.updateFromTuple( workingMemory,
                                                leftTuple );
-            if ( this.resultBinder.isAllowedCachedLeft( result ) ) {
-                final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( result );
+            if ( this.resultBinder.isAllowedCachedLeft( handle ) ) {
                 accresult.handle = handle;
 
                 this.sink.propagateAssertTuple( leftTuple,
                                                 handle,
                                                 context,
                                                 workingMemory );
+            } else {
+                workingMemory.getFactHandleFactory().destroyFactHandle( handle );
             }
+        } else {
+            workingMemory.getFactHandleFactory().destroyFactHandle( handle );
         }
 
     }
@@ -368,8 +373,9 @@
 
         // First alpha node filters
         boolean isAllowed = true;
+        final InternalFactHandle createdHandle = workingMemory.getFactHandleFactory().newFactHandle( result, false, workingMemory ); // so far, result is not an event
         for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
-            if ( !this.resultConstraints[i].isAllowed( result,
+            if ( !this.resultConstraints[i].isAllowed( createdHandle,
                                                        workingMemory ) ) {
                 isAllowed = false;
                 break;
@@ -378,15 +384,18 @@
         if ( isAllowed ) {
             this.resultBinder.updateFromTuple( workingMemory,
                                                leftTuple );
-            if ( this.resultBinder.isAllowedCachedLeft( result ) ) {
-                final InternalFactHandle createdHandle = workingMemory.getFactHandleFactory().newFactHandle( result );
+            if ( this.resultBinder.isAllowedCachedLeft( createdHandle ) ) {
                 accresult.handle = createdHandle;
 
                 this.sink.propagateAssertTuple( leftTuple,
                                                 createdHandle,
                                                 context,
                                                 workingMemory );
+            } else {
+                workingMemory.getFactHandleFactory().destroyFactHandle( createdHandle );
             }
+        } else {
+            workingMemory.getFactHandleFactory().destroyFactHandle( createdHandle );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -129,7 +129,7 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) throws FactException {
-        if ( this.constraint.isAllowed( handle.getObject(),
+        if ( this.constraint.isAllowed( handle,
                                         workingMemory ) ) {
             if ( isObjectMemoryEnabled() ) {
                 final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
@@ -151,7 +151,7 @@
             final FactHashTable memory = (FactHashTable) workingMemory.getNodeMemory( this );
             propagate = memory.remove( handle );
         } else {
-            propagate = this.constraint.isAllowed( handle.getObject(),
+            propagate = this.constraint.isAllowed( handle,
                                                    workingMemory );
         }
         if ( propagate ) {
@@ -311,7 +311,7 @@
         public void assertObject(final InternalFactHandle handle,
                                  final PropagationContext context,
                                  final InternalWorkingMemory workingMemory) {
-            if ( this.constraint.isAllowed( handle.getObject(),
+            if ( this.constraint.isAllowed( handle,
                                             workingMemory ) ) {
                 this.sink.assertObject( handle,
                                         context,

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,298 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 26, 2007
+ */
+package org.drools.reteoo;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.FactException;
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsQuery;
+import org.drools.base.ShadowProxy;
+import org.drools.base.ShadowProxyFactory;
+import org.drools.common.DroolsObjectInputStream;
+import org.drools.common.InternalRuleBase;
+import org.drools.objenesis.Objenesis;
+import org.drools.objenesis.ObjenesisStd;
+import org.drools.objenesis.instantiator.ObjectInstantiator;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.reteoo.builder.PatternBuilder;
+import org.drools.spi.ObjectType;
+import org.drools.util.Iterator;
+import org.drools.util.ObjectHashMap.ObjectEntry;
+
+public class ClassObjectTypeConf
+    implements
+    ObjectTypeConf,
+    Serializable {
+    // Objenesis instance without cache (false)
+    private static final Objenesis         OBJENESIS = new ObjenesisStd( false );
+
+    private final Class                    cls;
+    private transient InternalRuleBase     ruleBase;
+    private ObjectTypeNode[]               objectTypeNodes;
+
+    protected boolean                      shadowEnabled;
+    protected Class                        shadowClass;
+    protected transient ObjectInstantiator instantiator;
+
+    private ObjectTypeNode                 concreteObjectTypeNode;
+    
+    public ClassObjectTypeConf(final Class clazz, final boolean isEvent,
+                               final InternalRuleBase ruleBase) {
+        this.cls = clazz;
+        this.ruleBase = ruleBase;
+
+        ObjectType objectType = new ClassObjectType( clazz, isEvent );
+        this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
+        if ( this.concreteObjectTypeNode == null ) {
+            BuildContext context = new BuildContext( ruleBase,
+                                                     ((ReteooRuleBase) ruleBase.getRete().getRuleBase()).getReteooBuilder().getIdGenerator() );
+            if ( DroolsQuery.class == clazz ) {
+                context.setTupleMemoryEnabled( false );
+                context.setObjectTypeNodeMemoryEnabled( false );
+                context.setTerminalNodeMemoryEnabled( false );
+            } else if ( context.getRuleBase().getConfiguration().isSequential() ) {
+                // We are in sequential mode, so no nodes should have memory
+                context.setTupleMemoryEnabled( false );
+                context.setObjectTypeNodeMemoryEnabled( false );
+                context.setTerminalNodeMemoryEnabled( false );
+            } else {
+                context.setTupleMemoryEnabled( true );
+                context.setObjectTypeNodeMemoryEnabled( true );
+                context.setTerminalNodeMemoryEnabled( true );
+            }
+            // there must exist an ObjectTypeNode for this concrete class
+            this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( context,
+                                                                               objectType );
+        }
+
+        defineShadowProxyData( clazz );
+    }
+
+    public boolean isAssignableFrom(Object object) {
+        return this.cls.isAssignableFrom( (Class) object );
+    }
+
+    public ObjectTypeNode getConcreteObjectTypeNode() {
+        return this.concreteObjectTypeNode;
+    }
+
+    private void defineShadowProxyData(Class clazz) {
+        Rete rete = this.ruleBase.getRete();
+
+        if ( !ruleBase.getConfiguration().isShadowProxy() || clazz == null || !ruleBase.getConfiguration().isShadowed( clazz.getName() ) ) {
+            this.shadowEnabled = false;
+            this.shadowClass = null;
+            this.instantiator = null;
+            return;
+        }
+
+        //String pkgName = (pkg != null) ? pkg.getName() : "";
+        String pkgName = getPackageName( clazz,
+                                         clazz.getPackage() );
+        if ( "org.drools.reteoo".equals( pkgName ) || "org.drools.base".equals( pkgName ) ) {
+            // We don't shadow internal classes
+            this.shadowEnabled = false;
+            this.shadowClass = null;
+            this.instantiator = null;
+            return;
+        }
+
+        // try to generate proxy for the actual class
+        Class shadowClass = loadOrGenerateProxy( clazz,
+                                                 rete );
+
+        if ( shadowClass == null ) {
+            // if it failed, try to find a parent class
+            ObjectTypeNode[] nodes = this.getMatchingObjectTypes( clazz );
+            Class shadowClassRoot = clazz;
+            while ( shadowClass == null && (shadowClassRoot = this.findAFeasibleSuperclassOrInterface( nodes,
+                                                                                                       shadowClassRoot )) != null ) {
+                shadowClass = loadOrGenerateProxy( shadowClassRoot,
+                                                   rete );
+            }
+        }
+
+        if ( shadowClass != null ) {
+            this.shadowClass = shadowClass;
+            this.shadowEnabled = true;
+            setInstantiator();
+        }
+    }
+
+    /**
+     * This will return the package name - if the package is null, it will
+     * work it out from the class name (this is in cases where funky classloading is used).
+     */
+    public static String getPackageName(Class clazz,
+                                        Package pkg) {
+        String pkgName = "";
+        if ( pkg == null ) {
+            int index = clazz.getName().lastIndexOf( '.' );
+            if ( index != -1 ) pkgName = clazz.getName().substring( 0,
+                                                                    index );
+        } else {
+            pkgName = pkg.getName();
+        }
+        return pkgName;
+
+    }
+
+    private Class loadOrGenerateProxy(Class clazz,
+                                      Rete rete) {
+        Class shadowClass = null;
+        final String shadowProxyName = ShadowProxyFactory.getProxyClassNameForClass( clazz );
+        try {
+            // if already loaded
+            shadowClass = rete.getRuleBase().getMapBackedClassLoader().loadClass( shadowProxyName );
+        } catch ( final ClassNotFoundException cnfe ) {
+            // otherwise, create and load
+            final byte[] proxyBytes = ShadowProxyFactory.getProxyBytes( clazz );
+            if ( proxyBytes != null ) {
+                rete.getRuleBase().getMapBackedClassLoader().addClass( shadowProxyName,
+                                                                       proxyBytes );
+                try {
+                    shadowClass = rete.getRuleBase().getMapBackedClassLoader().loadClass( shadowProxyName );
+                } catch ( ClassNotFoundException e ) {
+                    throw new RuntimeException( "Unable to find or generate the ShadowProxy implementation for '" + clazz + "'" );
+                }
+            }
+
+        }
+        return shadowClass;
+    }
+
+    private Class findAFeasibleSuperclassOrInterface(ObjectTypeNode[] nodes,
+                                                     Class clazz) {
+
+        // check direct superclass
+        Class ret = clazz.getSuperclass();
+        boolean isOk = ret != null && ret != Object.class; // we don't want to shadow java.lang.Object
+        if ( isOk ) {
+            for ( int i = 0; isOk && ret != null && i < nodes.length; i++ ) {
+                isOk = nodes[i].getSinkPropagator().size() == 0 || nodes[i].isAssignableFrom( ret );
+            }
+        }
+
+        if ( !isOk ) {
+            // try the interfaces now...
+            Class[] interfaces = clazz.getInterfaces();
+            boolean notFound = true;
+            isOk = interfaces.length > 0;
+            for ( int i = 0; notFound && i < interfaces.length; i++ ) {
+                ret = interfaces[i];
+                isOk = interfaces[i] != Serializable.class && interfaces[i] != Cloneable.class && interfaces[i] != Comparable.class;
+                for ( int j = 0; isOk && j < nodes.length; j++ ) {
+                    isOk = nodes[j].getSinkPropagator().size() == 0 || nodes[j].isAssignableFrom( ret );
+                }
+                notFound = !isOk;
+            }
+            if ( notFound ) {
+                ret = null;
+            }
+        }
+
+        // ret now contains a superclass/interface that can be shadowed or null if none
+        return ret;
+    }
+
+    private void readObject(ObjectInputStream stream) throws IOException,
+                                                     ClassNotFoundException {
+        stream.defaultReadObject();
+        this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
+    }
+
+    /**
+     *
+     */
+    private void setInstantiator() {
+        this.instantiator = OBJENESIS.getInstantiatorOf( this.shadowClass );
+    }
+
+    public Object getShadow(final Object fact) throws RuntimeDroolsException {
+        ShadowProxy proxy = null;
+        if ( isShadowEnabled() ) {
+            try {
+                if ( Collection.class.isAssignableFrom( this.shadowClass ) || Map.class.isAssignableFrom( this.shadowClass ) ) {
+                    // if it is a collection, try to instantiate using constructor
+                    try {
+                        proxy = (ShadowProxy) this.shadowClass.getConstructor( new Class[]{cls} ).newInstance( new Object[]{fact} );
+                    } catch ( Exception e ) {
+                        // not possible to instantiate using constructor
+                    }
+                }
+                if ( proxy == null ) {
+                    if ( this.instantiator == null ) {
+                        this.setInstantiator();
+                    }
+                    proxy = (ShadowProxy) this.instantiator.newInstance();
+                }
+                proxy.setShadowedObject( fact );
+            } catch ( final Exception e ) {
+                throw new RuntimeDroolsException( "Error creating shadow fact for object: " + fact,
+                                                  e );
+            }
+        }
+        return proxy;
+    }
+
+    public boolean isShadowEnabled() {
+        return this.shadowEnabled;
+    }
+
+    public void resetCache() {
+        this.objectTypeNodes = null;
+        defineShadowProxyData( cls );
+    }
+
+    public ObjectTypeNode[] getObjectTypeNodes() {
+        if ( this.objectTypeNodes == null ) {
+            this.objectTypeNodes = getMatchingObjectTypes( this.cls );
+        }
+        return this.objectTypeNodes;
+    }
+
+    private ObjectTypeNode[] getMatchingObjectTypes(final Class clazz) throws FactException {
+        final List cache = new ArrayList();
+
+        final Iterator it = ruleBase.getRete().getObjectTypeNodes().newIterator();
+        for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
+            final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
+            if ( node.isAssignableFrom( clazz ) ) {
+                cache.add( node );
+            }
+        }
+
+        return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
+    }
+
+    public boolean isActive() {
+        return getConcreteObjectTypeNode().getSinkPropagator().getSinks().length > 0;
+    }
+    
+    public boolean isEvent() {
+        return this.concreteObjectTypeNode.getObjectType().isEvent();
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -20,7 +20,6 @@
 import java.util.Collection;
 
 import org.drools.common.BetaConstraints;
-import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.builder.BuildContext;
@@ -107,7 +106,7 @@
         final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
 
         final Collection result = this.collect.instantiateResultObject();
-        final InternalFactHandle resultHandle = workingMemory.getFactHandleFactory().newFactHandle( result );
+        final InternalFactHandle resultHandle = workingMemory.getFactHandleFactory().newFactHandle( result, false, workingMemory );
         CollectResult colresult = new CollectResult();
         colresult.handle = resultHandle;
         colresult.propagated = false;
@@ -127,7 +126,7 @@
 
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
             InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 if( this.unwrapRightObject ) {
                     handle = ((ReteTuple) handle.getObject()).getLastHandle(); 
                 }
@@ -138,7 +137,7 @@
         // First alpha node filters
         boolean isAllowed = true;
         for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
-            if ( !this.resultConstraints[i].isAllowed( result,
+            if ( !this.resultConstraints[i].isAllowed( resultHandle,
                                                        workingMemory ) ) {
                 isAllowed = false;
                 break;
@@ -147,7 +146,7 @@
         if ( isAllowed ) {
             this.resultsBinder.updateFromTuple( workingMemory,
                                                 leftTuple );
-            if ( this.resultsBinder.isAllowedCachedLeft( result ) ) {
+            if ( this.resultsBinder.isAllowedCachedLeft( resultHandle ) ) {
                 colresult.propagated = true;
                 this.sink.propagateAssertTuple( leftTuple,
                                                 resultHandle,
@@ -301,7 +300,7 @@
         // First alpha node filters
         boolean isAllowed = true;
         for ( int i = 0, length = this.resultConstraints.length; i < length; i++ ) {
-            if ( !this.resultConstraints[i].isAllowed( result.handle.getObject(),
+            if ( !this.resultConstraints[i].isAllowed( result.handle,
                                                        workingMemory ) ) {
                 isAllowed = false;
                 break;
@@ -310,7 +309,7 @@
         if ( isAllowed ) {
             this.resultsBinder.updateFromTuple( workingMemory,
                                                 leftTuple );
-            if ( this.resultsBinder.isAllowedCachedLeft( result.handle.getObject() ) ) {
+            if ( this.resultsBinder.isAllowedCachedLeft( result.handle ) ) {
                 result.propagated = true;
                 this.sink.propagateAssertTuple( leftTuple,
                                                 result.handle,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ExistsNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,7 +17,6 @@
 package org.drools.reteoo;
 
 import org.drools.common.BetaConstraints;
-import org.drools.common.EmptyBetaConstraints;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.builder.BuildContext;
@@ -101,7 +100,7 @@
                                           leftTuple );
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {            
             final InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 leftTuple.setMatch( handle );
                 break;
             }            
@@ -185,7 +184,7 @@
                     
                     for ( FactEntry entry = (FactEntry) tupleIt.next(); entry != null; entry = (FactEntry) tupleIt.next() ) {
                         final InternalFactHandle rightHandle = entry.getFactHandle();
-                        if ( this.constraints.isAllowedCachedLeft( rightHandle.getObject() ) ) {
+                        if ( this.constraints.isAllowedCachedLeft( rightHandle ) ) {
                             tuple.setMatch( rightHandle );
                             break;
                         }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FactTemplateTypeConf.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 26, 2007
+ */
+package org.drools.reteoo;
+
+import java.io.Serializable;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.common.InternalRuleBase;
+import org.drools.facttemplates.FactTemplate;
+import org.drools.facttemplates.FactTemplateObjectType;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.reteoo.builder.PatternBuilder;
+import org.drools.spi.ObjectType;
+
+public class FactTemplateTypeConf
+    implements
+    ObjectTypeConf,
+    Serializable {
+    private InternalRuleBase ruleBase;
+    private FactTemplate     factTemplate;
+    private ObjectTypeNode   concreteObjectTypeNode;
+    private ObjectTypeNode[] cache;
+
+    public FactTemplateTypeConf(FactTemplate factTemplate,
+                                InternalRuleBase ruleBase) {
+        this.ruleBase = ruleBase;
+        this.factTemplate = factTemplate;
+        ObjectType objectType = new FactTemplateObjectType( factTemplate );
+        this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
+        if ( this.concreteObjectTypeNode == null ) {
+            BuildContext context = new BuildContext( ruleBase,
+                                                     ((ReteooRuleBase) ruleBase.getRete().getRuleBase()).getReteooBuilder().getIdGenerator() );
+            if ( context.getRuleBase().getConfiguration().isSequential() ) {
+                // We are in sequential mode, so no nodes should have memory
+                context.setTupleMemoryEnabled( false );
+                context.setObjectTypeNodeMemoryEnabled( false );
+                context.setTerminalNodeMemoryEnabled( false );
+            } else {
+                context.setTupleMemoryEnabled( true );
+                context.setObjectTypeNodeMemoryEnabled( true );
+                context.setTerminalNodeMemoryEnabled( true );
+            }
+            // there must exist an ObjectTypeNode for this concrete class                
+            this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( context,
+                                                                               objectType );
+        }
+        this.cache = new ObjectTypeNode[]{this.concreteObjectTypeNode};
+    }
+
+    public ObjectTypeNode getConcreteObjectTypeNode() {
+        return this.concreteObjectTypeNode;
+    }
+
+    public ObjectTypeNode[] getObjectTypeNodes() {
+        if ( this.cache == null ) {
+            this.cache = new ObjectTypeNode[]{this.concreteObjectTypeNode};
+        }
+        return this.cache;
+    }
+
+    public Object getShadow(Object fact) throws RuntimeDroolsException {
+        return null;
+    }
+
+    public boolean isShadowEnabled() {
+        return false;
+    }
+
+    public boolean isAssignableFrom(Object object) {
+        return this.factTemplate.equals( object );
+    }
+
+    public void resetCache() {
+        this.cache = null;
+    }
+
+    public boolean isActive() {
+        return true;
+    }
+    
+    public boolean isEvent() {
+        return false;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/FromNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -66,31 +66,30 @@
                                                                           context ); it.hasNext(); ) {
             final Object object = it.next();
 
+            final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( object, false, workingMemory );
+
+            boolean isAllowed = true;
             if ( this.alphaConstraints != null ) {
                 // First alpha node filters
-                boolean isAllowed = true;
                 for ( int i = 0, length = this.alphaConstraints.length; i < length; i++ ) {
-                    if ( !this.alphaConstraints[i].isAllowed( object,
+                    if ( !this.alphaConstraints[i].isAllowed( handle,
                                                               workingMemory ) ) {
                         // next iteration
                         isAllowed = false;
                         break;
                     }
                 }
-                if ( !isAllowed ) {
-                    continue;
-                }
             }
 
-            if ( this.betaConstraints.isAllowedCachedLeft( object ) ) {
-                final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( object );
-
+            if ( isAllowed && this.betaConstraints.isAllowedCachedLeft( handle ) ) {
                 list.add( new LinkedListEntry( handle ) );
 
                 this.sink.propagateAssertTuple( leftTuple,
                                                 handle,
                                                 context,
                                                 workingMemory );
+            } else {
+                workingMemory.getFactHandleFactory().destroyFactHandle( handle );
             }
         }
         if ( !list.isEmpty() ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -103,7 +103,7 @@
                                           leftTuple );
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
             final InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 this.sink.propagateAssertTuple( leftTuple,
                                                 handle,
                                                 context,
@@ -212,7 +212,7 @@
                                           leftTuple );
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
             final InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 this.sink.propagateRetractTuple( leftTuple,
                                                  handle,
                                                  context,
@@ -237,7 +237,7 @@
                                               tuple );
             for ( FactEntry entry = (FactEntry) objectIter.next(); entry != null; entry = (FactEntry) objectIter.next() ) {
                 final InternalFactHandle handle = entry.getFactHandle();
-                if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+                if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                     sink.assertTuple( new ReteTuple( tuple,
                                                      handle ),
                                       context,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/NotNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -99,7 +99,7 @@
         
         for ( FactEntry entry = (FactEntry) it.next(); entry != null; entry = (FactEntry) it.next() ) {
             final InternalFactHandle handle = entry.getFactHandle();
-            if ( this.constraints.isAllowedCachedLeft( handle.getObject() ) ) {
+            if ( this.constraints.isAllowedCachedLeft( handle ) ) {
                 leftTuple.setMatch( handle );
                 break;
             }
@@ -185,7 +185,7 @@
                     
                     for ( FactEntry entry = (FactEntry) tupleIt.next(); entry != null; entry = (FactEntry) tupleIt.next() ) {
                         final InternalFactHandle rightHandle = entry.getFactHandle();
-                        if ( this.constraints.isAllowedCachedLeft( rightHandle.getObject() ) ) {
+                        if ( this.constraints.isAllowedCachedLeft( rightHandle ) ) {
                             tuple.setMatch( rightHandle );
                             break;
                         }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeConf.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/ObjectTypeConf.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeConf.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeConf.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 26, 2007
+ */
+package org.drools.reteoo;
+
+import org.drools.RuntimeDroolsException;
+
+public interface ObjectTypeConf {
+    public ObjectTypeNode[] getObjectTypeNodes();
+
+    public boolean isShadowEnabled();
+
+    public Object getShadow(final Object fact) throws RuntimeDroolsException;
+
+    public ObjectTypeNode getConcreteObjectTypeNode();
+
+    public void resetCache();
+
+    public boolean isAssignableFrom(Object object);
+    
+    public boolean isActive();
+    
+    public boolean isEvent();
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -19,37 +19,20 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
 
-import org.drools.FactException;
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuntimeDroolsException;
-import org.drools.base.ClassObjectType;
-import org.drools.base.DroolsQuery;
 import org.drools.base.ShadowProxy;
-import org.drools.base.ShadowProxyFactory;
 import org.drools.common.BaseNode;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
-import org.drools.facttemplates.Fact;
-import org.drools.facttemplates.FactTemplate;
-import org.drools.facttemplates.FactTemplateObjectType;
-import org.drools.objenesis.instantiator.ObjectInstantiator;
-import org.drools.reteoo.builder.BuildContext;
-import org.drools.reteoo.builder.PatternBuilder;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PropagationContext;
 import org.drools.util.FactEntry;
 import org.drools.util.FactHashTable;
 import org.drools.util.Iterator;
 import org.drools.util.ObjectHashMap;
-import org.drools.util.ObjectHashMap.ObjectEntry;
 
 /**
  * The Rete-OO network.
@@ -73,8 +56,7 @@
 public class Rete extends ObjectSource
     implements
     Serializable,
-    ObjectSink,
-    NodeMemory {
+    ObjectSink {
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
@@ -123,53 +105,22 @@
     public void assertObject(final InternalFactHandle handle,
                              final PropagationContext context,
                              final InternalWorkingMemory workingMemory) {
-        final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
 
-        Object object = handle.getObject();
+        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( handle.getObject() );
 
-        ObjectTypeConf ojectTypeConf;
-        if ( object instanceof Fact ) {
-            String key = ((Fact) object).getFactTemplate().getName();
-            ojectTypeConf = (ObjectTypeConf) memory.get( key );
-            if ( ojectTypeConf == null ) {
-                ojectTypeConf = new FactTemplateTypeConf( ((Fact) object).getFactTemplate(),
-                                                          this.ruleBase );
-                memory.put( key,
-                            ojectTypeConf,
-                            false );
-            }
-            object = key;
-        } else {
-            Class cls = null;
-            if ( object instanceof ShadowProxy ) {
-                cls = ((ShadowProxy) object).getShadowedObject().getClass();
+        // checks if shadow is enabled
+        if ( objectTypeConf.isShadowEnabled() ) {
+            // need to improve this
+            if ( !(handle.getObject() instanceof ShadowProxy) ) {
+                // replaces the actual object by its shadow before propagating
+                handle.setObject( objectTypeConf.getShadow( handle.getObject() ) );
+                handle.setShadowFact( true );
             } else {
-                cls = object.getClass();
+                ((ShadowProxy) handle.getObject()).updateProxy();
             }
-
-            ojectTypeConf = (ObjectTypeConf) memory.get( cls );
-            if ( ojectTypeConf == null ) {
-                ojectTypeConf = new ClassObjectTypeConf( cls,
-                                                         this.ruleBase );
-                memory.put( cls,
-                            ojectTypeConf,
-                            false );
-            }
-
-            // checks if shadow is enabled
-            if ( ojectTypeConf.isShadowEnabled() ) {
-                // need to improve this
-                if ( !(handle.getObject() instanceof ShadowProxy) ) {
-                    // replaces the actual object by its shadow before propagating
-                    handle.setObject( ojectTypeConf.getShadow( handle.getObject() ) );
-                    handle.setShadowFact( true );
-                } else {
-                    ((ShadowProxy) handle.getObject()).updateProxy();
-                }
-            }
         }
 
-        ObjectTypeNode[] cachedNodes = ojectTypeConf.getObjectTypeNodes();
+        ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
 
         for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
             cachedNodes[i].assertObject( handle,
@@ -190,17 +141,9 @@
     public void retractObject(final InternalFactHandle handle,
                               final PropagationContext context,
                               final InternalWorkingMemory workingMemory) {
-        final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
-
         final Object object = handle.getObject();
 
-        ObjectTypeConf objectTypeConf;
-        if ( object instanceof ShadowProxy ) {
-            objectTypeConf = (ObjectTypeConf) memory.get( ((ShadowProxy) object).getShadowedObject().getClass() );
-        } else {
-            objectTypeConf = (ObjectTypeConf) memory.get( object.getClass() );
-        }
-
+        ObjectTypeConf objectTypeConf = workingMemory.getObjectTypeConf( object );
         ObjectTypeNode[] cachedNodes = objectTypeConf.getObjectTypeNodes();
 
         if ( cachedNodes == null ) {
@@ -257,10 +200,6 @@
         return this.objectTypeNodes;
     }
 
-    public Object createMemory(final RuleBaseConfiguration config) {
-        return new ObjectHashMap();
-    }
-
     public InternalRuleBase getRuleBase() {
         return this.ruleBase;
     }
@@ -286,14 +225,10 @@
                            final PropagationContext context,
                            final InternalWorkingMemory workingMemory) {
         // JBRULES-612: the cache MUST be invalidated when a new node type is added to the network, so iterate and reset all caches.
-        final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );
-        Iterator it = memory.iterator();
         final ObjectTypeNode node = (ObjectTypeNode) sink;
+        final ObjectType newObjectType = node.getObjectType();
 
-        ObjectType newObjectType = node.getObjectType();
-
-        for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
-            ObjectTypeConf objectTypeConf = (ObjectTypeConf) entry.getValue();
+        for ( ObjectTypeConf objectTypeConf : workingMemory.getObjectTypeConfMap().values() ) {
             if ( newObjectType.isAssignableFrom( objectTypeConf.getConcreteObjectTypeNode().getObjectType() ) ) {
                 objectTypeConf.resetCache();
                 ObjectTypeNode sourceNode = objectTypeConf.getConcreteObjectTypeNode();
@@ -306,20 +241,6 @@
                 }
             }
         }
-
-        //        ObjectType
-        //        this.c
-
-        //        final ObjectTypeNode node = (ObjectTypeNode) sink;
-        //        it = workingMemory.getFactHandleMap().iterator();
-        //        for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
-        //            final InternalFactHandle handle = (InternalFactHandle) entry.getValue();
-        //            if ( node.matches( handle.getObject() ) ) {
-        //                node.assertObject( handle,
-        //                                   context,
-        //                                   workingMemory );
-        //            }
-        //        }
     }
     
     public boolean isObjectMemoryEnabled() {
@@ -328,339 +249,6 @@
 
     public void setObjectMemoryEnabled(boolean objectMemoryEnabled) {
         throw new UnsupportedOperationException("ORete has no Object memory");
-    }     
-
-    public static interface ObjectTypeConf {
-        public ObjectTypeNode[] getObjectTypeNodes();
-
-        public boolean isShadowEnabled();
-
-        public Object getShadow(final Object fact) throws RuntimeDroolsException;
-
-        public ObjectTypeNode getConcreteObjectTypeNode();
-
-        public void resetCache();
-
-        public boolean isAssignableFrom(Object object);
-        
-        public boolean isActive();
     }
 
-    public static class FactTemplateTypeConf
-        implements
-        ObjectTypeConf,
-        Serializable {
-        private InternalRuleBase ruleBase;
-        private FactTemplate     factTemplate;
-        private ObjectTypeNode   concreteObjectTypeNode;
-        private ObjectTypeNode[] cache;
-
-        public FactTemplateTypeConf(FactTemplate factTemplate,
-                                    InternalRuleBase ruleBase) {
-            this.ruleBase = ruleBase;
-            this.factTemplate = factTemplate;
-            ObjectType objectType = new FactTemplateObjectType( factTemplate );
-            this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
-            if ( this.concreteObjectTypeNode == null ) {
-                BuildContext context = new BuildContext( ruleBase,
-                                                         ((ReteooRuleBase) ruleBase.getRete().getRuleBase()).getReteooBuilder().getIdGenerator() );
-                if ( context.getRuleBase().getConfiguration().isSequential() ) {
-                    // We are in sequential mode, so no nodes should have memory
-                    context.setTupleMemoryEnabled( false );
-                    context.setObjectTypeNodeMemoryEnabled( false );
-                    context.setTerminalNodeMemoryEnabled( false );
-                } else {
-                    context.setTupleMemoryEnabled( true );
-                    context.setObjectTypeNodeMemoryEnabled( true );
-                    context.setTerminalNodeMemoryEnabled( true );
-                }
-                // there must exist an ObjectTypeNode for this concrete class                
-                this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( context,
-                                                                                   objectType );
-            }
-            this.cache = new ObjectTypeNode[]{this.concreteObjectTypeNode};
-        }
-
-        public ObjectTypeNode getConcreteObjectTypeNode() {
-            return this.concreteObjectTypeNode;
-        }
-
-        public ObjectTypeNode[] getObjectTypeNodes() {
-            if ( this.cache == null ) {
-                this.cache = new ObjectTypeNode[]{this.concreteObjectTypeNode};
-            }
-            return this.cache;
-        }
-
-        public Object getShadow(Object fact) throws RuntimeDroolsException {
-            return null;
-        }
-
-        public boolean isShadowEnabled() {
-            return false;
-        }
-
-        public boolean isAssignableFrom(Object object) {
-            return this.factTemplate.equals( object );
-        }
-
-        public void resetCache() {
-            this.cache = null;
-        }
-
-        public boolean isActive() {
-            return true;
-        }
-
-    }
-
-    public static class ClassObjectTypeConf
-        implements
-        ObjectTypeConf,
-        Serializable {
-
-        private final Class                    cls;
-        private transient InternalRuleBase     ruleBase;
-        private ObjectTypeNode[]               objectTypeNodes;
-
-        protected boolean                      shadowEnabled;
-        protected Class                        shadowClass;
-        protected transient ObjectInstantiator instantiator;
-
-        private ObjectTypeNode                 concreteObjectTypeNode;
-
-        public ClassObjectTypeConf(Class clazz,
-                                   InternalRuleBase ruleBase) {
-            this.cls = clazz;
-            this.ruleBase = ruleBase;
-
-            ObjectType objectType = new ClassObjectType( clazz );
-            this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes().get( objectType );
-            if ( this.concreteObjectTypeNode == null ) {
-                BuildContext context = new BuildContext( ruleBase,
-                                                         ((ReteooRuleBase) ruleBase.getRete().getRuleBase()).getReteooBuilder().getIdGenerator() );
-                if ( DroolsQuery.class == clazz ) {
-                    context.setTupleMemoryEnabled( false );
-                    context.setObjectTypeNodeMemoryEnabled( false );
-                    context.setTerminalNodeMemoryEnabled( false );
-                } else if ( context.getRuleBase().getConfiguration().isSequential() ) {
-                    // We are in sequential mode, so no nodes should have memory
-                    context.setTupleMemoryEnabled( false );
-                    context.setObjectTypeNodeMemoryEnabled( false );
-                    context.setTerminalNodeMemoryEnabled( false );
-                } else {
-                    context.setTupleMemoryEnabled( true );
-                    context.setObjectTypeNodeMemoryEnabled( true );
-                    context.setTerminalNodeMemoryEnabled( true );
-                }
-                // there must exist an ObjectTypeNode for this concrete class
-                this.concreteObjectTypeNode = PatternBuilder.attachObjectTypeNode( context,
-                                                                                   objectType );
-            }
-
-            defineShadowProxyData( clazz );
-        }
-
-        public boolean isAssignableFrom(Object object) {
-            return this.cls.isAssignableFrom( (Class) object );
-        }
-
-        public ObjectTypeNode getConcreteObjectTypeNode() {
-            return this.concreteObjectTypeNode;
-        }
-
-        private void defineShadowProxyData(Class clazz) {
-            Rete rete = this.ruleBase.getRete();
-
-            if ( !ruleBase.getConfiguration().isShadowProxy() || clazz == null || !ruleBase.getConfiguration().isShadowed( clazz.getName() ) ) {
-                this.shadowEnabled = false;
-                this.shadowClass = null;
-                this.instantiator = null;
-                return;
-            }
-
-            //String pkgName = (pkg != null) ? pkg.getName() : "";
-            String pkgName = getPackageName( clazz,
-                                             clazz.getPackage() );
-            if ( "org.drools.reteoo".equals( pkgName ) || "org.drools.base".equals( pkgName ) ) {
-                // We don't shadow internal classes
-                this.shadowEnabled = false;
-                this.shadowClass = null;
-                this.instantiator = null;
-                return;
-            }
-
-            // try to generate proxy for the actual class
-            Class shadowClass = loadOrGenerateProxy( clazz,
-                                                     rete );
-
-            if ( shadowClass == null ) {
-                // if it failed, try to find a parent class
-                ObjectTypeNode[] nodes = this.getMatchingObjectTypes( clazz );
-                Class shadowClassRoot = clazz;
-                while ( shadowClass == null && (shadowClassRoot = this.findAFeasibleSuperclassOrInterface( nodes,
-                                                                                                           shadowClassRoot )) != null ) {
-                    shadowClass = loadOrGenerateProxy( shadowClassRoot,
-                                                       rete );
-                }
-            }
-
-            if ( shadowClass != null ) {
-                this.shadowClass = shadowClass;
-                this.shadowEnabled = true;
-                setInstantiator();
-            }
-        }
-
-        /**
-         * This will return the package name - if the package is null, it will
-         * work it out from the class name (this is in cases where funky classloading is used).
-         */
-        public static String getPackageName(Class clazz,
-                                            Package pkg) {
-            String pkgName = "";
-            if ( pkg == null ) {
-                int index = clazz.getName().lastIndexOf( '.' );
-                if ( index != -1 ) pkgName = clazz.getName().substring( 0,
-                                                                        index );
-            } else {
-                pkgName = pkg.getName();
-            }
-            return pkgName;
-
-        }
-
-        private Class loadOrGenerateProxy(Class clazz,
-                                          Rete rete) {
-            Class shadowClass = null;
-            final String shadowProxyName = ShadowProxyFactory.getProxyClassNameForClass( clazz );
-            try {
-                // if already loaded
-                shadowClass = rete.getRuleBase().getMapBackedClassLoader().loadClass( shadowProxyName );
-            } catch ( final ClassNotFoundException cnfe ) {
-                // otherwise, create and load
-                final byte[] proxyBytes = ShadowProxyFactory.getProxyBytes( clazz );
-                if ( proxyBytes != null ) {
-                    rete.getRuleBase().getMapBackedClassLoader().addClass( shadowProxyName,
-                                                                           proxyBytes );
-                    try {
-                        shadowClass = rete.getRuleBase().getMapBackedClassLoader().loadClass( shadowProxyName );
-                    } catch ( ClassNotFoundException e ) {
-                        throw new RuntimeException( "Unable to find or generate the ShadowProxy implementation for '" + clazz + "'" );
-                    }
-                }
-
-            }
-            return shadowClass;
-        }
-
-        private Class findAFeasibleSuperclassOrInterface(ObjectTypeNode[] nodes,
-                                                         Class clazz) {
-
-            // check direct superclass
-            Class ret = clazz.getSuperclass();
-            boolean isOk = ret != null && ret != Object.class; // we don't want to shadow java.lang.Object
-            if ( isOk ) {
-                for ( int i = 0; isOk && ret != null && i < nodes.length; i++ ) {
-                    isOk = nodes[i].getSinkPropagator().size() == 0 || nodes[i].isAssignableFrom( ret );
-                }
-            }
-
-            if ( !isOk ) {
-                // try the interfaces now...
-                Class[] interfaces = clazz.getInterfaces();
-                boolean notFound = true;
-                isOk = interfaces.length > 0;
-                for ( int i = 0; notFound && i < interfaces.length; i++ ) {
-                    ret = interfaces[i];
-                    isOk = interfaces[i] != Serializable.class && interfaces[i] != Cloneable.class && interfaces[i] != Comparable.class;
-                    for ( int j = 0; isOk && j < nodes.length; j++ ) {
-                        isOk = nodes[j].getSinkPropagator().size() == 0 || nodes[j].isAssignableFrom( ret );
-                    }
-                    notFound = !isOk;
-                }
-                if ( notFound ) {
-                    ret = null;
-                }
-            }
-
-            // ret now contains a superclass/interface that can be shadowed or null if none
-            return ret;
-        }
-
-        private void readObject(ObjectInputStream stream) throws IOException,
-                                                         ClassNotFoundException {
-            stream.defaultReadObject();
-            this.ruleBase = ((DroolsObjectInputStream) stream).getRuleBase();
-        }
-
-        /**
-         *
-         */
-        private void setInstantiator() {
-            this.instantiator = ruleBase.getObjenesis().getInstantiatorOf(this.shadowClass);
-        }
-
-        public Object getShadow(final Object fact) throws RuntimeDroolsException {
-            ShadowProxy proxy = null;
-            if ( isShadowEnabled() ) {
-                try {
-                    if ( Collection.class.isAssignableFrom( this.shadowClass ) || Map.class.isAssignableFrom( this.shadowClass ) ) {
-                        // if it is a collection, try to instantiate using constructor
-                        try {
-                            proxy = (ShadowProxy) this.shadowClass.getConstructor( new Class[]{cls} ).newInstance( new Object[]{fact} );
-                        } catch ( Exception e ) {
-                            // not possible to instantiate using constructor
-                        }
-                    }
-                    if ( proxy == null ) {
-                        if ( this.instantiator == null ) {
-                            this.setInstantiator();
-                        }
-                        proxy = (ShadowProxy) this.instantiator.newInstance();
-                    }
-                    proxy.setShadowedObject( fact );
-                } catch ( final Exception e ) {
-                    throw new RuntimeDroolsException( "Error creating shadow fact for object: " + fact,
-                                                      e );
-                }
-            }
-            return proxy;
-        }
-
-        public boolean isShadowEnabled() {
-            return this.shadowEnabled;
-        }
-
-        public void resetCache() {
-            this.objectTypeNodes = null;
-            defineShadowProxyData( cls );
-        }
-
-        public ObjectTypeNode[] getObjectTypeNodes() {
-            if ( this.objectTypeNodes == null ) {
-                this.objectTypeNodes = getMatchingObjectTypes( this.cls );
-            }
-            return this.objectTypeNodes;
-        }
-
-        private ObjectTypeNode[] getMatchingObjectTypes(final Class clazz) throws FactException {
-            final List cache = new ArrayList();
-
-            final Iterator it = ruleBase.getRete().getObjectTypeNodes().newIterator();
-            for ( ObjectEntry entry = (ObjectEntry) it.next(); entry != null; entry = (ObjectEntry) it.next() ) {
-                final ObjectTypeNode node = (ObjectTypeNode) entry.getValue();
-                if ( node.isAssignableFrom( clazz ) ) {
-                    cache.add( node );
-                }
-            }
-
-            return (ObjectTypeNode[]) cache.toArray( new ObjectTypeNode[cache.size()] );
-        }
-
-        public boolean isActive() {
-            return getConcreteObjectTypeNode().getSinkPropagator().getSinks().length > 0;
-        }
-    }
-
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,10 +16,14 @@
  * limitations under the License.
  */
 
+import org.drools.TemporalSession;
+import org.drools.WorkingMemory;
 import org.drools.common.AbstractFactHandleFactory;
 import org.drools.common.DefaultFactHandle;
+import org.drools.common.EventFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.spi.FactHandleFactory;
+import org.drools.temporal.SessionClock;
 
 public class ReteooFactHandleFactory extends AbstractFactHandleFactory {
 
@@ -30,10 +34,21 @@
      */
     protected final InternalFactHandle newFactHandle(final long id,
                                                      final Object object,
-                                                     final long recency) {
-        return new DefaultFactHandle( id,
-                                      object,
-                                      recency );
+                                                     final long recency,
+                                                     final boolean isEvent,
+                                                     final WorkingMemory workingMemory ) {
+        if ( isEvent ) {
+            SessionClock clock = ((TemporalSession) workingMemory).getSessionClock(); 
+            return new EventFactHandle( id,
+                                        object,
+                                        recency,
+                                        clock.getCurrentTime(),
+                                        0 );  // primitive events have 0 duration
+        } else {
+            return new DefaultFactHandle( id,
+                                          object,
+                                          recency );
+        }
     }
 
     /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -22,12 +22,14 @@
 import java.io.Serializable;
 import java.util.Iterator;
 
+import org.drools.ClockType;
 import org.drools.FactException;
 import org.drools.FactHandle;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.StatefulSession;
 import org.drools.StatelessSession;
+import org.drools.TemporalSession;
 import org.drools.common.AbstractRuleBase;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
@@ -37,8 +39,8 @@
 import org.drools.event.RuleBaseEventListener;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
 import org.drools.rule.InvalidPatternException;
+import org.drools.rule.Package;
 import org.drools.rule.Rule;
-import org.drools.rule.Package;
 import org.drools.spi.ExecutorServiceFactory;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;
@@ -218,10 +220,22 @@
                                  workingMemory );
     }
 
+    public synchronized StatefulSession newStatefulSession( final boolean keepReference ) {
+        return newStatefulSession( keepReference, null );
+    }
+    
+    public synchronized TemporalSession newTemporalSession( final ClockType clockType ) {
+        return (TemporalSession) newStatefulSession( true, clockType);
+    }
+    
+    public synchronized TemporalSession newTemporalSession( final boolean keepReference, final ClockType clockType ) {
+        return (TemporalSession) newStatefulSession( keepReference, clockType );
+    }
+    
     /**
      * @see RuleBase
      */
-    public synchronized StatefulSession newStatefulSession(final boolean keepReference) {
+    private StatefulSession newStatefulSession( final boolean keepReference, final ClockType clockType ) {
         if ( this.config.isSequential() ) {
             throw new RuntimeException( "Cannot have a stateful rule session, with sequential configuration set to true" );
         }
@@ -229,9 +243,16 @@
 
         synchronized ( this.pkgs ) {
             ExecutorService executor = ExecutorServiceFactory.createExecutorService(  this.config.getExecutorService() );;
-            session = new ReteooStatefulSession( nextWorkingMemoryCounter(),
-                                                 this,
-                                                 executor );
+            if( clockType == null ) {
+                session = new ReteooStatefulSession( nextWorkingMemoryCounter(),
+                                                     this,
+                                                     executor );
+            } else {
+                session = new ReteooTemporalSession( nextWorkingMemoryCounter(),
+                                                             this,
+                                                             executor,
+                                                             clockType.createInstance() );
+            }
 
             executor.setCommandExecutor( new CommandExecutor( session ) );
 
@@ -242,7 +263,7 @@
                 }
             }
 
-            final InitialFactHandle handle = new InitialFactHandle( session.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject() ) );
+            final InitialFactHandle handle = new InitialFactHandle( session.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject(), false, session ) );
 
             session.queueWorkingMemoryAction( new WorkingMemoryReteAssertAction( handle,
                                                                                  false,
@@ -280,4 +301,5 @@
         Serializable {
         private static final long serialVersionUID = 400L;
     }
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatelessSession.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -60,7 +60,7 @@
             wm.setAgendaEventSupport( this.agendaEventSupport );
             wm.setRuleFlowEventSupport( ruleFlowEventSupport );
 
-            final InitialFactHandle handle = new InitialFactHandle( wm.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject() ) );
+            final InitialFactHandle handle = new InitialFactHandle( wm.getFactHandleFactory().newFactHandle( new InitialFactHandleDummyObject(), false, wm ) );
 
             wm.queueWorkingMemoryAction( new WorkingMemoryReteAssertAction( handle,
                                                                             false,

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooTemporalSession.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/reteoo/ReteooTemporalSession.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooTemporalSession.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooTemporalSession.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 28, 2007
+ */
+package org.drools.reteoo;
+
+import org.drools.TemporalSession;
+import org.drools.common.InternalRuleBase;
+import org.drools.concurrent.ExecutorService;
+import org.drools.temporal.SessionClock;
+
+/**
+ * ReteooStatefulTemporalSession implements a temporal enabled session
+ * for Reteoo rulebases
+ * 
+ * @author etirelli
+ */
+public class ReteooTemporalSession<T extends SessionClock> extends ReteooStatefulSession
+    implements
+    TemporalSession<T> {
+
+    private static final long serialVersionUID = -2129661675928809928L;
+    
+    private T sessionClock;
+
+    public ReteooTemporalSession(int id,
+                                         InternalRuleBase ruleBase,
+                                         ExecutorService executorService,
+                                         T clock) {
+        super( id,
+               ruleBase,
+               executorService );
+        this.sessionClock = clock;
+    }
+
+    public T getSessionClock() {
+        return this.sessionClock;
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -87,7 +87,7 @@
     public QueryResults getQueryResults(final String query, final Object[] arguments) {
 
         Object object = new DroolsQuery( query, arguments );
-        InternalFactHandle handle = this.handleFactory.newFactHandle( object );
+        InternalFactHandle handle = this.handleFactory.newFactHandle( object, false, this );
         
         insert( handle,
                 object,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RightInputAdapterNode.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -92,7 +92,7 @@
                             final InternalWorkingMemory workingMemory) {
 
         // creating a dummy fact handle to wrap the tuple
-        final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( tuple );
+        final InternalFactHandle handle = workingMemory.getFactHandleFactory().newFactHandle( tuple, false, workingMemory );
         
         if ( this.tupleMemoryEnabled ) {
             final ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( this );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,5 +1,6 @@
 package org.drools.rule;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.Extractor;
@@ -14,11 +15,11 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
             if ( !this.restrictions[i].isAllowed( extractor,
-                                                  object,
+                                                  handle,
                                                   workingMemory ) ) {
                 return false;
             }
@@ -27,10 +28,10 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
             if ( !this.restrictions[i].isAllowedCachedLeft( this.contextEntry.contextEntries[i],
-                                                            object ) ) {
+                                                            handle ) ) {
                 return false;
             }
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -19,6 +19,7 @@
 
 import java.util.Arrays;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -40,11 +41,11 @@
     /**
      * {@inheritDoc}
      */
-    public boolean isAllowed(Object object,
+    public boolean isAllowed(InternalFactHandle handle,
                              InternalWorkingMemory workingMemory) {
         if ( this.alphaConstraints.length > 0 ) {
             for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
-                if ( !this.alphaConstraints[i].isAllowed( object,
+                if ( !this.alphaConstraints[i].isAllowed( handle,
                                                           workingMemory ) ) {
                     return false;
                 }
@@ -57,11 +58,11 @@
      * {@inheritDoc}
      */
     public boolean isAllowedCachedLeft(ContextEntry context,
-                                       Object object) {
+                                       InternalFactHandle handle) {
         if ( this.betaConstraints.length > 0 ) {
             for ( int i = 0; i < this.betaConstraints.length; i++ ) {
                 if ( !this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry)context).contexts[i],
-                                                                   object ) ) {
+                                                                   handle ) ) {
                     return false;
                 }
             }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ImportDeclaration.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/rule/ImportDeclaration.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ImportDeclaration.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ImportDeclaration.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Nov 7, 2007
+ */
+package org.drools.rule;
+
+import java.io.Serializable;
+
+/**
+ * A class to represent an import declaration. That declaration
+ * may have additional metadata associated to it, like a flag
+ * stating if the imported class is an event or not
+ * 
+ * @author etirelli
+ */
+public class ImportDeclaration implements Serializable {
+
+    private static final long serialVersionUID = 6410032114027977766L;
+
+    private String target;
+    private boolean isEvent;
+
+    /**
+     * Creates an empty import declaration 
+     */
+    public ImportDeclaration() {
+        this( null, false );
+    }
+
+    /**
+     * Creates an import declaration for the given target.
+     * 
+     * @param target
+     */
+    public ImportDeclaration( String target ) {
+        this( target, false ); 
+    }
+    
+    /**
+     * Creates an import declaration for the given target.
+     * 
+     * @param target the import target
+     * @param isEvent true if the target is an event-type target, false otherwise.
+     */
+    public ImportDeclaration(String target,
+                             boolean isEvent) {
+        super();
+        this.target = target;
+        this.isEvent = isEvent;
+    }
+
+    public boolean isEvent() {
+        return isEvent;
+    }
+
+    public void setEvent(boolean isEvent) {
+        this.isEvent = isEvent;
+    }
+
+    public String getTarget() {
+        return target;
+    }
+
+    public void setTarget(String target) {
+        this.target = target;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + (isEvent ? 1231 : 1237);
+        result = PRIME * result + ((target == null) ? 0 : target.hashCode());
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final ImportDeclaration other = (ImportDeclaration) obj;
+        if ( isEvent != other.isEvent ) return false;
+        if ( target == null ) {
+            if ( other.target != null ) return false;
+        } else if ( !target.equals( other.target ) ) return false;
+        return true;
+    }
+
+    /**
+     * Returns true if this ImportDeclaration correctly matches to
+     * the given clazz
+     * 
+     * @param name
+     * @return
+     */
+    public boolean matches( Class clazz ) {
+        // fully qualified import?
+        if( this.target.equals( clazz.getName() ) ) {
+            return true;
+        }
+        
+        // wild card imports
+        if( this.target.endsWith( ".*" ) ) {
+            String prefix = this.target.substring( 0, this.target.indexOf( ".*" ) );
+            
+            // package import: import my.package.*
+            if( prefix.equals( clazz.getPackage().getName() ) ) {
+                return true;
+            }
+            
+            // inner class imports with wild card?
+            // by looking at the ClassTypeResolver class, it seems we do not support
+            // the usage of wild cards when importing static inner classes like the
+            // java static imports allow
+        }
+        return false;
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Evaluator;
@@ -77,10 +78,10 @@
                                              newDecl );
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         return this.restriction.isAllowed( this.extractor,
-                                           object,
+                                           handle,
                                            workingMemory );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -56,19 +56,19 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemoiry) {
         return this.evaluator.evaluate( null,
                                         extractor,
-                                        object,
+                                        handle.getObject(),
                                         this.field );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         return this.evaluator.evaluate( null,
                                         ((LiteralContextEntry) context).getFieldExtractor(),
-                                        object,
+                                        handle.getObject(),
                                         this.field );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,5 +1,6 @@
 package org.drools.rule;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -65,10 +66,10 @@
         return this.extractor.equals( other.extractor ) && this.restrictions.equals( other.restrictions );
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         return this.restrictions.isAllowed( this.extractor,
-                                            object,
+                                            handle,
                                             workingMemory );
     }
 
@@ -77,9 +78,9 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         return this.restrictions.isAllowedCachedLeft( context,
-                                                      object );
+                                                      handle );
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,5 +1,6 @@
 package org.drools.rule;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.Extractor;
@@ -14,11 +15,11 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
             if ( this.restrictions[i].isAllowed( extractor,
-                                                 object,
+                                                 handle,
                                                  workingMemory ) ) {
                 return true;
             }
@@ -27,10 +28,10 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         for ( int i = 0, ilength = this.restrictions.length; i < ilength; i++ ) {
             if ( this.restrictions[i].isAllowedCachedLeft( this.contextEntry.contextEntries[i],
-                                                           object ) ) {
+                                                           handle ) ) {
                 return true;
             }
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -18,6 +18,7 @@
 
 import java.util.Arrays;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -42,11 +43,11 @@
     /**
      * {@inheritDoc}
      */
-    public boolean isAllowed(Object object,
+    public boolean isAllowed(InternalFactHandle handle,
                              InternalWorkingMemory workingMemory) {
         if ( this.alphaConstraints.length > 0 ) {
             for ( int i = 0; i < this.alphaConstraints.length; i++ ) {
-                if ( this.alphaConstraints[i].isAllowed( object,
+                if ( this.alphaConstraints[i].isAllowed( handle,
                                                          workingMemory ) ) {
                     return true;
                 }
@@ -60,11 +61,11 @@
      * {@inheritDoc}
      */
     public boolean isAllowedCachedLeft(ContextEntry context,
-                                       Object object) {
+                                       InternalFactHandle handle) {
         if ( this.betaConstraints.length > 0 ) {
             for ( int i = 0; i < this.betaConstraints.length; i++ ) {
                 if ( this.betaConstraints[i].isAllowedCachedLeft( ((MultiFieldConstraintContextEntry)context).contexts[i],
-                                                                  object ) ) {
+                                                                  handle ) ) {
                     return true;
                 }
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -57,37 +57,37 @@
     /**
      *
      */
-    private static final long      serialVersionUID = 400L;
+    private static final long              serialVersionUID = 400L;
 
     // ------------------------------------------------------------
     // Instance members
     // ------------------------------------------------------------
 
     /** Name of the pkg. */
-    private String                 name;
+    private String                         name;
 
     /** Set of all rule-names in this <code>Package</code>. */
-    private Map                    rules;
+    private Map                            rules;
 
-    private Set                    imports;
+    private Map<String, ImportDeclaration> imports;
 
-    private List                   functions;
+    private List                           functions;
 
-    private Set                    staticImports;
+    private Set                            staticImports;
 
-    private Map                    globals;
+    private Map                            globals;
 
-    private Map                    factTemplates;
+    private Map                            factTemplates;
 
-    private Map                    ruleFlows;
+    private Map                            ruleFlows;
 
-    private PackageCompilationData packageCompilationData;
+    private PackageCompilationData         packageCompilationData;
 
     /** This is to indicate the the package has no errors during the compilation/building phase */
-    private boolean                valid            = true;
+    private boolean                        valid            = true;
 
     /** This will keep a summary error message as to why this package is not valid */
-    private String                 errorSummary;
+    private String                         errorSummary;
 
     // ------------------------------------------------------------
     // Constructors
@@ -121,7 +121,7 @@
     public Package(final String name,
                    ClassLoader parentClassLoader) {
         this.name = name;
-        this.imports = new HashSet();
+        this.imports = new HashMap<String, ImportDeclaration>();
         this.staticImports = Collections.EMPTY_SET;
         this.rules = new LinkedHashMap();
         this.ruleFlows = Collections.EMPTY_MAP;
@@ -150,12 +150,11 @@
         stream.writeObject( this.imports );
         stream.writeObject( this.staticImports );
         stream.writeObject( this.functions );
-        stream.writeObject( this.factTemplates );        
+        stream.writeObject( this.factTemplates );
         stream.writeObject( this.ruleFlows );
         stream.writeObject( this.globals );
         stream.writeBoolean( this.valid );
 
-
         // Rules must be restored by an ObjectInputStream that can resolve using a given ClassLoader to handle seaprately by storing as
         // a byte[]
         final ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -175,11 +174,11 @@
         // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
         this.packageCompilationData = (PackageCompilationData) stream.readObject();
         this.name = (String) stream.readObject();
-        this.imports = (Set) stream.readObject();
+        this.imports = (Map<String, ImportDeclaration>) stream.readObject();
         this.staticImports = (Set) stream.readObject();
         this.functions = (List) stream.readObject();
         this.factTemplates = (Map) stream.readObject();
-        this.ruleFlows = (Map) stream.readObject();        
+        this.ruleFlows = (Map) stream.readObject();
         this.globals = (Map) stream.readObject();
         this.valid = stream.readBoolean();
 
@@ -189,7 +188,6 @@
         //  Use a custom ObjectInputStream that can resolve against a given classLoader
         final DroolsObjectInputStream streamWithLoader = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ),
                                                                                       this.packageCompilationData.getClassLoader() );
-        
 
         this.rules = (Map) streamWithLoader.readObject();
     }
@@ -207,15 +205,15 @@
         return this.name;
     }
 
-    public void addImport(final String importEntry) {
-        this.imports.add( importEntry );
+    public void addImport(final ImportDeclaration importDecl) {
+        this.imports.put( importDecl.getTarget(), importDecl );
     }
 
     public void removeImport(final String importEntry) {
         this.imports.remove( importEntry );
     }
 
-    public Set getImports() {
+    public Map<String, ImportDeclaration> getImports() {
         return this.imports;
     }
 
@@ -264,7 +262,7 @@
     }
 
     public PackageCompilationData removeFunction(final String functionName) {
-        if ( !this.functions.remove( functionName )) {
+        if ( !this.functions.remove( functionName ) ) {
             return null;
         }
         this.packageCompilationData.remove( this.name + "." + StringUtils.ucFirst( functionName ) );
@@ -449,15 +447,44 @@
     public int hashCode() {
         return this.name.hashCode();
     }
+    
+    /**
+     * Returns true if clazz is imported as an Event class in this package 
+     * @param clazz
+     * @return
+     */
+    public boolean isEvent( Class clazz ) {
+        if( clazz == null ) {
+            return false;
+        }
+        // check if clazz is resolved by any of the import declarations
+        for( ImportDeclaration imp : this.imports.values() ) {
+            if( imp.isEvent() && imp.matches( clazz ) ) {
+                return true;
+            }
+        }
+        // if it is not resolved, try superclass 
+        if( this.isEvent( clazz.getSuperclass() ) ) {
+            return true;
+        }
+        
+        // if it is no resolved, try interfaces
+        for( Class interf : clazz.getInterfaces() ) {
+            if( this.isEvent( interf ) ) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     public void clear() {
         this.rules.clear();
         this.packageCompilationData.clear();
-        this.ruleFlows.clear();       
+        this.ruleFlows.clear();
         this.imports.clear();
         this.functions.clear();
         this.staticImports.clear();
         this.globals.clear();
-        this.factTemplates.clear();        
+        this.factTemplates.clear();
     }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -214,10 +214,10 @@
         return new PredicateContextEntry();
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         try {
-            return this.expression.evaluate( object,
+            return this.expression.evaluate( handle.getObject(),
                                              null,
                                              this.previousDeclarations,
                                              this.localDeclarations,
@@ -229,16 +229,16 @@
     }
 
     public boolean isAllowed(Extractor extractor,
-                             Object object,
+                             InternalFactHandle handle,
                              InternalWorkingMemory workingMemory) {
         throw new UnsupportedOperationException("Method not supported. Please contact development team.");
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         try {
             final PredicateContextEntry ctx = (PredicateContextEntry) context;
-            return this.expression.evaluate( object,
+            return this.expression.evaluate( handle.getObject(),
                                              ctx.leftTuple,
                                              this.previousDeclarations,
                                              this.localDeclarations,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,6 +17,7 @@
  */
 
 import org.drools.RuntimeDroolsException;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
@@ -97,11 +98,11 @@
         return this.restriction.getContextEntry();
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         try {
             return this.restriction.isAllowed( this.fieldExtractor,
-                                               object,
+                                               handle,
                                                null,
                                                workingMemory );
         } catch ( final Exception e ) {
@@ -111,11 +112,11 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         try {
             final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
             return this.restriction.isAllowed( this.fieldExtractor,
-                                               object,
+                                               handle,
                                                ctx.getTuple(),
                                                ctx.getWorkingMemory() );
         } catch ( final Exception e ) {
@@ -129,7 +130,7 @@
         try {
             final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
             return this.restriction.isAllowed( this.fieldExtractor,
-                                               ctx.getObject(),
+                                               ctx.getHandle(),
                                                tuple,
                                                ctx.getWorkingMemory() );
         } catch ( final Exception e ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -159,13 +159,13 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
         try {
             return this.evaluator.evaluate( null,
                                             extractor,
-                                            object, this.expression.evaluate( object,
+                                            handle.getObject(), this.expression.evaluate( handle.getObject(),
                                                                                               tuple,
                                                                                               this.previousDeclarations,
                                                                                               this.localDeclarations,
@@ -176,13 +176,13 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemoiry) {
         throw new UnsupportedOperationException( "does not support method call isAllowed(Object object, InternalWorkingMemory workingMemoiry)" );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         throw new UnsupportedOperationException( "does not support method call isAllowed(Object object, InternalWorkingMemory workingMemoiry)" );
     }
 
@@ -284,7 +284,7 @@
         private static final long    serialVersionUID = 400L;
 
         public FieldExtractor        fieldExtractor;
-        public Object                object;
+        public InternalFactHandle    handle;
         public ReteTuple             leftTuple;
         public InternalWorkingMemory workingMemory;
         public Declaration[]         previousDeclarations;
@@ -311,7 +311,7 @@
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
             this.workingMemory = workingMemory;
-            this.object = handle.getObject();
+            this.handle = handle;
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -337,8 +337,8 @@
         /* (non-Javadoc)
          * @see org.drools.rule.ReturnValueContextEntry#getObject()
          */
-        public Object getObject() {
-            return this.object;
+        public InternalFactHandle getHandle() {
+            return this.handle;
         }
 
         /* (non-Javadoc)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -66,17 +67,17 @@
         return this.restriction.getEvaluator();
     }
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         return this.restriction.isAllowed( this.fieldExtractor,
-                                           object,
+                                           handle,
                                            workingMemory );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         return this.restriction.isAllowedCachedLeft( context,
-                                                     object );
+                                                     handle );
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -18,7 +18,7 @@
 
 import java.util.Arrays;
 
-import org.drools.base.evaluators.Operator;
+import org.drools.base.ValueType;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
@@ -69,27 +69,27 @@
     }
 
     public boolean isAllowed(final Extractor extractor,
-                             final Object object,
+                             final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory) {
         return this.evaluator.evaluate( workingMemory,
                                         this.contextEntry.extractor,
-                                        object,
+                                        this.evaluator.prepareObject( handle ),
                                         this.contextEntry.declaration.getExtractor(),
-                                        object );
+                                        this.evaluator.prepareObject( handle ) );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         return this.evaluator.evaluateCachedLeft( ((VariableContextEntry) context).workingMemory,
                                                   (VariableContextEntry) context,
-                                                  object );
+                                                  this.evaluator.prepareObject( handle ) );
     }
 
     public boolean isAllowedCachedRight(final ReteTuple tuple,
                                         final ContextEntry context) {
         return this.evaluator.evaluateCachedRight( ((VariableContextEntry) context).workingMemory,
                                                    (VariableContextEntry) context,
-                                                   tuple.get( this.declaration ).getObject() );
+                                                   this.evaluator.prepareObject( tuple.get( this.declaration ) ) );
     }
 
     public String toString() {
@@ -125,26 +125,28 @@
 
     private final VariableContextEntry createContextEntry(final Evaluator eval,
                                                           final FieldExtractor fieldExtractor) {
-        if ( Operator.MEMBEROF.equals( eval.getOperator() ) || Operator.NOTMEMBEROF.equals( eval.getOperator() ) ) {
+        ValueType coerced = eval.getCoercedValueType();
+        
+        if ( coerced.isBoolean() ) {
+            return new BooleanVariableContextEntry( fieldExtractor,
+                                                    this.declaration,
+                                                    this.evaluator );
+        } else if ( coerced.isFloatNumber() ) {
+            return new DoubleVariableContextEntry( fieldExtractor,
+                                                   this.declaration,
+                                                   this.evaluator );
+        } else if ( coerced.isIntegerNumber() ) {
+            return new LongVariableContextEntry( fieldExtractor,
+                                                 this.declaration,
+                                                 this.evaluator );
+        } else if ( coerced.isChar() ) {
+            return new CharVariableContextEntry( fieldExtractor,
+                                                 this.declaration,
+                                                 this.evaluator );
+        } else {
             return new ObjectVariableContextEntry( fieldExtractor,
-                                                   this.declaration );
-        } else {
-            if ( fieldExtractor.getValueType().isBoolean() ) {
-                return new BooleanVariableContextEntry( fieldExtractor,
-                                                        this.declaration );
-            } else if ( fieldExtractor.getValueType().isFloatNumber() ) {
-                return new DoubleVariableContextEntry( fieldExtractor,
-                                                       this.declaration );
-            } else if ( fieldExtractor.getValueType().isIntegerNumber() ) {
-                return new LongVariableContextEntry( fieldExtractor,
-                                                     this.declaration );
-            } else if ( fieldExtractor.getValueType().isChar() ) {
-                return new CharVariableContextEntry( fieldExtractor,
-                                                     this.declaration );
-            } else {
-                return new ObjectVariableContextEntry( fieldExtractor,
-                                                       this.declaration );
-            }
+                                                   this.declaration,
+                                                   this.evaluator );
         }
     }
 
@@ -162,6 +164,7 @@
         implements
         ContextEntry {
         public FieldExtractor        extractor;
+        public Evaluator             evaluator;
         public Object                object;
         public Declaration           declaration;
         public ReteTuple             reteTuple;
@@ -171,9 +174,11 @@
         public InternalWorkingMemory workingMemory;
 
         public VariableContextEntry(final FieldExtractor extractor,
-                                    final Declaration declaration) {
+                                    final Declaration declaration,
+                                    final Evaluator evaluator) {
             this.extractor = extractor;
             this.declaration = declaration;
+            this.evaluator = evaluator;
         }
 
         public ContextEntry getNext() {
@@ -216,9 +221,11 @@
         public Object             right;
 
         public ObjectVariableContextEntry(final FieldExtractor extractor,
-                                          final Declaration declaration) {
+                                          final Declaration declaration,
+                                          final Evaluator evaluator) {
             super( extractor,
-                   declaration );
+                   declaration,
+                   evaluator);
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -226,19 +233,19 @@
             this.reteTuple = tuple;
             this.workingMemory = workingMemory;
             this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
-                                                                         tuple.get( this.declaration ).getObject() );
+                                                                         evaluator.prepareObject( tuple.get( this.declaration ) ) );
             this.left = this.declaration.getExtractor().getValue( workingMemory,
-                                                                  tuple.get( this.declaration ).getObject() );
+                                                                  evaluator.prepareObject( tuple.get( this.declaration ) ) );
         }
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
-            this.object = handle.getObject();
+            this.object = evaluator.prepareObject( handle );
             this.workingMemory = workingMemory;
             this.rightNull = this.extractor.isNullValue( workingMemory,
-                                                         handle.getObject() );
+                                                         evaluator.prepareObject( handle ) );
             this.right = this.extractor.getValue( workingMemory,
-                                                  handle.getObject() );
+                                                  evaluator.prepareObject( handle ) );
         }
     }
 
@@ -250,9 +257,11 @@
         public long               right;
 
         public LongVariableContextEntry(final FieldExtractor extractor,
-                                        final Declaration declaration) {
+                                        final Declaration declaration,
+                                        final Evaluator evaluator) {
             super( extractor,
-                   declaration );
+                   declaration,
+                   evaluator );
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -260,11 +269,11 @@
             this.reteTuple = tuple;
             this.workingMemory = workingMemory;
             this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
-                                                                         tuple.get( this.declaration ).getObject() );
+                                                                         evaluator.prepareObject( tuple.get( this.declaration ) ) );
 
             if ( !leftNull ) {
                 this.left = this.declaration.getExtractor().getLongValue( workingMemory,
-                                                                          tuple.get( this.declaration ).getObject() );
+                                                                          evaluator.prepareObject( tuple.get( this.declaration ) ) );
             } else {
                 this.left = 0;
             }
@@ -272,14 +281,14 @@
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
-            this.object = handle.getObject();
+            this.object = evaluator.prepareObject( handle );
             this.workingMemory = workingMemory;
             this.rightNull = this.extractor.isNullValue( workingMemory,
-                                                         handle.getObject() );
+                                                         evaluator.prepareObject( handle ) );
 
             if ( !rightNull ) { // avoid a NullPointerException
                 this.right = this.extractor.getLongValue( workingMemory,
-                                                          handle.getObject() );
+                                                          evaluator.prepareObject( handle ) );
             } else {
                 this.right = 0;
             }
@@ -294,9 +303,11 @@
         public char               right;
 
         public CharVariableContextEntry(final FieldExtractor extractor,
-                                        final Declaration declaration) {
+                                        final Declaration declaration,
+                                        final Evaluator evaluator) {
             super( extractor,
-                   declaration );
+                   declaration,
+                   evaluator );
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -304,11 +315,11 @@
             this.reteTuple = tuple;
             this.workingMemory = workingMemory;
             this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
-                                                                         tuple.get( this.declaration ).getObject() );
+                                                                         evaluator.prepareObject( tuple.get( this.declaration ) ) );
 
             if ( !leftNull ) {
                 this.left = this.declaration.getExtractor().getCharValue( workingMemory,
-                                                                          tuple.get( this.declaration ).getObject() );
+                                                                          evaluator.prepareObject( tuple.get( this.declaration ) ) );
             } else {
                 this.left = 0;
             }
@@ -316,14 +327,14 @@
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
-            this.object = handle.getObject();
+            this.object = evaluator.prepareObject( handle );
             this.workingMemory = workingMemory;
             this.rightNull = this.extractor.isNullValue( workingMemory,
-                                                         handle.getObject() );
+                                                         evaluator.prepareObject( handle ) );
 
             if ( !rightNull ) { // avoid a NullPointerException
                 this.right = this.extractor.getCharValue( workingMemory,
-                                                          handle.getObject() );
+                                                          evaluator.prepareObject( handle ) );
             } else {
                 this.right = 0;
             }
@@ -338,9 +349,11 @@
         public double             right;
 
         public DoubleVariableContextEntry(final FieldExtractor extractor,
-                                          final Declaration declaration) {
+                                          final Declaration declaration,
+                                          final Evaluator evaluator) {
             super( extractor,
-                   declaration );
+                   declaration,
+                   evaluator );
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -348,11 +361,11 @@
             this.reteTuple = tuple;
             this.workingMemory = workingMemory;
             this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
-                                                                         tuple.get( this.declaration ).getObject() );
+                                                                         evaluator.prepareObject( tuple.get( this.declaration ) ) );
 
             if ( !leftNull ) {
                 this.left = this.declaration.getExtractor().getDoubleValue( workingMemory,
-                                                                            tuple.get( this.declaration ).getObject() );
+                                                                            evaluator.prepareObject( tuple.get( this.declaration ) ) );
             } else {
                 this.left = 0;
             }
@@ -360,14 +373,14 @@
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
-            this.object = handle.getObject();
+            this.object = evaluator.prepareObject( handle );
             this.workingMemory = workingMemory;
             this.rightNull = this.extractor.isNullValue( workingMemory,
-                                                         handle.getObject() );
+                                                         evaluator.prepareObject( handle ) );
 
             if ( !rightNull ) { // avoid a NullPointerException
                 this.right = this.extractor.getDoubleValue( workingMemory,
-                                                            handle.getObject() );
+                                                            evaluator.prepareObject( handle ) );
             } else {
                 this.right = 0;
             }
@@ -381,9 +394,11 @@
         public boolean            right;
 
         public BooleanVariableContextEntry(final FieldExtractor extractor,
-                                           final Declaration declaration) {
+                                           final Declaration declaration,
+                                           final Evaluator evaluator) {
             super( extractor,
-                   declaration );
+                   declaration,
+                   evaluator );
         }
 
         public void updateFromTuple(final InternalWorkingMemory workingMemory,
@@ -391,11 +406,11 @@
             this.reteTuple = tuple;
             this.workingMemory = workingMemory;
             this.leftNull = this.declaration.getExtractor().isNullValue( workingMemory,
-                                                                         tuple.get( this.declaration ).getObject() );
+                                                                         evaluator.prepareObject( tuple.get( this.declaration ) ) );
 
             if ( !leftNull ) {
                 this.left = this.declaration.getExtractor().getBooleanValue( workingMemory,
-                                                                             tuple.get( this.declaration ).getObject() );
+                                                                             evaluator.prepareObject( tuple.get( this.declaration ) ) );
             } else {
                 this.left = false;
             }
@@ -403,14 +418,14 @@
 
         public void updateFromFactHandle(final InternalWorkingMemory workingMemory,
                                          final InternalFactHandle handle) {
-            this.object = handle.getObject();
+            this.object = evaluator.prepareObject( handle );
             this.workingMemory = workingMemory;
             this.rightNull = this.extractor.isNullValue( workingMemory,
-                                                         handle.getObject() );
+                                                         evaluator.prepareObject( handle ) );
 
             if ( !rightNull ) { // avoid a NullPointerException
                 this.right = this.extractor.getBooleanValue( workingMemory,
-                                                             handle.getObject() );
+                                                             evaluator.prepareObject( handle ) );
             } else {
                 this.right = false;
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AlphaNodeFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AlphaNodeFieldConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AlphaNodeFieldConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,12 +16,13 @@
  * limitations under the License.
  */
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 
 public interface AlphaNodeFieldConstraint
     extends
     Constraint {
 
-    public boolean isAllowed(Object object,
+    public boolean isAllowed(InternalFactHandle handle,
                              InternalWorkingMemory workingMemory);
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/BetaNodeFieldConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.ContextEntry;
 
@@ -24,7 +25,7 @@
     Constraint {
 
     public boolean isAllowedCachedLeft(ContextEntry context,
-                                       Object object);
+                                       InternalFactHandle handle);
 
     public boolean isAllowedCachedRight(ReteTuple tuple,
                                         ContextEntry context);

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -20,18 +20,56 @@
 
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 
+/**
+ * A public interface to be implemented by all evaluators
+ */
 public interface Evaluator
     extends
     Serializable {
 
+    /**
+     * Returns the type of the values this evaluator operates upon.
+     * 
+     * @return
+     */
     public ValueType getValueType();
 
+    /**
+     * Returns the operator representation object for this evaluator
+     * 
+     * @return
+     */
     public Operator getOperator();
+    
+    /**
+     * Returns the value type this evaluator will coerce
+     * operands to, during evaluation. This is useful for
+     * operators like "memberOf", that always convert to
+     * Object when evaluating, independently of the source
+     * operand value type.
+     * 
+     * @return
+     */
+    public ValueType getCoercedValueType();
 
     /**
+     * There are evaluators that operate on fact attributes and
+     * there are evaluators that operato on fact handle attributes
+     * (metadata). 
+     * 
+     * This method allows the evaluator to prepare the object
+     * to be evaluated. That includes, unwrapping the object if needed.
+     *  
+     * @param handle
+     * @return
+     */
+    public Object prepareObject( InternalFactHandle handle );
+    
+    /**
      * This method will extract the value from the object1 using the 
      * extractor and compare it with the object2.
      * @param workingMemory TODO

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FactHandleFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -19,6 +19,7 @@
 import java.io.Serializable;
 
 import org.drools.FactHandle;
+import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
 
 /**
@@ -37,7 +38,7 @@
      * 
      * @return The handle.
      */
-    InternalFactHandle newFactHandle(Object object);
+    InternalFactHandle newFactHandle(Object object, boolean isEvent, WorkingMemory workingMemory );
 
     /**
      * Increases the recency of the FactHandle

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 
-import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 
 /**
@@ -45,7 +44,14 @@
     
     boolean isAssignableFrom(Object object);
     
-    boolean isAssignableFrom(ObjectType objectType);    
+    boolean isAssignableFrom(ObjectType objectType);
+    
+    /**
+     * Returns true if the object type represented by this object
+     * is an event object type. False otherwise.
+     * @return
+     */
+    boolean isEvent();
 
     ValueType getValueType();
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -2,6 +2,7 @@
 
 import java.io.Serializable;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 import org.drools.rule.ContextEntry;
@@ -14,11 +15,11 @@
     Declaration[] getRequiredDeclarations();
 
     public boolean isAllowed(Extractor extractor,
-                             Object object,
+                             InternalFactHandle handle,
                              InternalWorkingMemory workingMemory);
 
     public boolean isAllowedCachedLeft(ContextEntry context,
-                                       Object object);
+                                       InternalFactHandle handle);
 
     public boolean isAllowedCachedRight(ReteTuple tuple,
                                         ContextEntry context);

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/temporal)

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/temporal/SessionClock.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,39 +0,0 @@
-/*
- * Copyright 2007 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Created on Oct 17, 2007
- */
-package org.drools.temporal;
-
-/**
- * A clock interface that all engine clocks must implement
- * 
- * @author etirelli
- */
-public interface SessionClock {
-    
-    /**
-     * Returns the current time. There is no semantics attached
-     * to the long return value, so it will depend on the actual
-     * implementation. For isntance, for a real clock it may be
-     * milliseconds.
-     * 
-     * @return The current time. The unit of the time, depends on
-     * the actual clock implementation.
-     * 
-     */
-    public long getCurrentTime();
-    
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/temporal/SessionClock.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Oct 17, 2007
+ */
+package org.drools.temporal;
+
+/**
+ * A clock interface that all engine clocks must implement
+ * 
+ * @author etirelli
+ */
+public interface SessionClock {
+    
+    /**
+     * Returns the current time. There is no semantics attached
+     * to the long return value, so it will depend on the actual
+     * implementation. For isntance, for a real clock it may be
+     * milliseconds.
+     * 
+     * @return The current time. The unit of the time, depends on
+     * the actual clock implementation.
+     * 
+     */
+    public long getCurrentTime();
+    
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java	2007-12-10 14:54:35 UTC (rev 17159)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,53 +0,0 @@
-/*
- * Copyright 2007 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Created on Oct 17, 2007
- */
-package org.drools.temporal;
-
-/**
- * A SessionPseudoClock is a clock that allows the user to explicitly 
- * control current time.
- * 
- * @author etirelli
- *
- */
-public class SessionPseudoClock
-    implements
-    SessionClock {
-    
-    private long timer;
-
-    public SessionPseudoClock() {
-        this.timer = 0;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.drools.temporal.SessionClock#getCurrentTime()
-     */
-    public long getCurrentTime() {
-        return this.timer;
-    }
-    
-    public long advanceTime( long millisecs ) {
-        this.timer += millisecs;
-        return this.timer;
-    }
-
-    public void setStartupTime(int i) {
-        this.timer = i;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/temporal/SessionPseudoClock.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Oct 17, 2007
+ */
+package org.drools.temporal;
+
+/**
+ * A SessionPseudoClock is a clock that allows the user to explicitly 
+ * control current time.
+ * 
+ * @author etirelli
+ *
+ */
+public class SessionPseudoClock
+    implements
+    SessionClock {
+    
+    private long timer;
+
+    public SessionPseudoClock() {
+        this.timer = 0;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.temporal.SessionClock#getCurrentTime()
+     */
+    public long getCurrentTime() {
+        return this.timer;
+    }
+    
+    public long advanceTime( long millisecs ) {
+        this.timer += millisecs;
+        return this.timer;
+    }
+
+    public void setStartupTime(int i) {
+        this.timer = i;
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-core/src/main/java/org/drools/util/DateUtils.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2007 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Dec 6, 2007
+ */
+package org.drools.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author etirelli
+ *
+ */
+public class DateUtils {
+    
+    private static final long       serialVersionUID    = 400L;
+    private static final String     DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
+    private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
+    private static SimpleDateFormat df = new SimpleDateFormat( DATE_FORMAT_MASK );
+    
+    
+    /** Use the simple date formatter to read the date from a string */
+    public static Date parseDate(final String input) {
+        try {
+            return df.parse( input );
+        } catch ( final ParseException e ) {
+            throw new IllegalArgumentException( "Invalid date input format: [" + input + "] it should follow: [" + DATE_FORMAT_MASK + "]" );
+        }
+    }
+
+    /** Converts the right hand side date as appropriate */
+    public static Date getRightDate(final Object object2) {
+        if ( object2 == null ) {
+            return null;
+        }
+        if ( object2 instanceof String ) {
+            return parseDate( (String) object2 );
+        } else if ( object2 instanceof Date ) {
+            return (Date) object2;
+        } else {
+            throw new IllegalArgumentException( "Unable to convert " + object2.getClass() + " to a Date." );
+        }
+    }
+
+    /** Check for the system property override, if it exists */
+    public static String getDateFormatMask() {
+        String fmt = System.getProperty( "drools.dateformat" );
+        if ( fmt == null ) {
+            fmt = DEFAULT_FORMAT_MASK;
+        }
+        return fmt;
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -29,7 +29,7 @@
 
 import junit.framework.TestCase;
 
-import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorRegistry;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.Declaration;
 import org.drools.rule.VariableRestriction.BooleanVariableContextEntry;
@@ -50,6 +50,8 @@
  */
 public class EvaluatorFactoryTest extends TestCase {
 
+    private EvaluatorRegistry registry = new EvaluatorRegistry();
+
     public void testObject() {
 
         final List list = new ArrayList();
@@ -588,7 +590,9 @@
         final Extractor extractor = new MockExtractor();
         for ( int i = 0; i < data.length; i++ ) {
             final Object[] row = data[i];
-            final Evaluator evaluator = valueType.getEvaluator( Operator.determineOperator( (String) row[1] ) );
+            boolean isNegated = ((String) row[1]).startsWith("not ");
+            String evaluatorStr =  isNegated ? ((String)row[1]).substring( 4 ) : (String)row[1];
+            final Evaluator evaluator = registry.getEvaluatorDefinition( evaluatorStr ).getEvaluator( valueType, evaluatorStr, isNegated, null );
             checkEvaluatorMethodWithFieldValue( valueType,
                                                 extractor,
                                                 row,
@@ -723,105 +727,91 @@
         final Declaration declaration = new Declaration( "test",
                                                    extractor,
                                                    null );
+        final ValueType coerced = evaluator.getCoercedValueType();
+        
+        if ( coerced.isIntegerNumber() ) {
+            final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
+                                                                             declaration,
+                                                                             evaluator );
 
-        if( Operator.MEMBEROF.equals( evaluator.getOperator() ) ||
-            Operator.NOTMEMBEROF.equals( evaluator.getOperator() ) ) {
-
-            final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
-                                                                                       declaration );
             if (row[2] == null) {
-               context.leftNull = true;
+                context.leftNull = true;
             } else {
-               context.left = row[2];
+                context.left = ((Number) row[2]).longValue();
             }
 
             if (row[0] == null) {
-               context.rightNull = true;
+                context.rightNull = true;
             } else {
-               context.right = row[0];
+                context.right = ((Number) row[0]).longValue();
             }
             return context;
+        } else if ( coerced.isChar() ) {
+            final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
 
-        } else {
-            if ( valueType.isIntegerNumber() ) {
-                final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
-                                                                                 declaration );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Character) row[2]).charValue();
+            }
 
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Number) row[2]).longValue();
-                }
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Character) row[0]).charValue();
+            }
+            return context;
+        } else if ( coerced.isBoolean() ) {
+            final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
 
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Number) row[0]).longValue();
-                }
-                return context;
-            } else if ( valueType.isChar() ) {
-                final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
-                                                                                       declaration );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Boolean) row[2]).booleanValue();
+            }
 
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Character) row[2]).charValue();
-                }
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Boolean) row[0]).booleanValue();
+            }
+            return context;
+        } else if ( coerced.isFloatNumber() ) {
+            final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
+                                                                                 declaration,
+                                                                                 evaluator );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).doubleValue();
+            }
 
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Character) row[0]).charValue();
-                }
-                return context;
-            } else if ( valueType.isBoolean() ) {
-                final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
-                                                                                       declaration );
-
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Boolean) row[2]).booleanValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Boolean) row[0]).booleanValue();
-                }
-                return context;
-            } else if ( valueType.isFloatNumber() ) {
-                final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
-                                                                                     declaration );
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = ((Number) row[2]).doubleValue();
-                }
-
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = ((Number) row[0]).doubleValue();
-                }
-                return context;
+            if (row[0] == null) {
+                context.rightNull = true;
             } else {
-                final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
-                                                                                     declaration );
-                if (row[2] == null) {
-                    context.leftNull = true;
-                } else {
-                    context.left = row[2];
-                }
+                context.right = ((Number) row[0]).doubleValue();
+            }
+            return context;
+        } else {
+            final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
+                                                                                 declaration,
+                                                                                 evaluator );
+            if (row[2] == null) {
+                context.leftNull = true;
+            } else {
+                context.left = row[2];
+            }
 
-                if (row[0] == null) {
-                    context.rightNull = true;
-                } else {
-                    context.right = row[0];
-                }
-                return context;
+            if (row[0] == null) {
+                context.rightNull = true;
+            } else {
+                context.right = row[0];
             }
+            return context;
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELCalendarCoercionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELCalendarCoercionTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELCalendarCoercionTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -3,10 +3,10 @@
 import java.util.Calendar;
 import java.util.Date;
 
-import org.drools.base.evaluators.DateFactory;
-
 import junit.framework.TestCase;
 
+import org.drools.util.DateUtils;
+
 public class MVELCalendarCoercionTest extends TestCase {
 
     public void testCalendar() {
@@ -23,7 +23,7 @@
         assertTrue(co.canConvertFrom( Calendar.class ));
 
         String dt = "10-Jul-1974";
-        Date dt_ = DateFactory.parseDate( dt );
+        Date dt_ = DateUtils.parseDate( dt );
         Calendar cal = Calendar.getInstance();
         cal.setTime( dt_ );
         assertEquals(cal, co.convertFrom( dt ));

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELDateCoercionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELDateCoercionTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/mvel/MVELDateCoercionTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -2,10 +2,10 @@
 
 import java.util.Date;
 
-import org.drools.base.evaluators.DateFactory;
-
 import junit.framework.TestCase;
 
+import org.drools.util.DateUtils;
+
 public class MVELDateCoercionTest extends TestCase {
 
     public void testDate() {
@@ -22,7 +22,7 @@
         assertTrue(co.canConvertFrom( Date.class ));
 
         String dt = "10-Jul-1974";
-        Date dt_ = DateFactory.parseDate( dt );
+        Date dt_ = DateUtils.parseDate( dt );
         assertEquals(dt_, co.convertFrom( dt ));
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -3,11 +3,18 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import junit.framework.TestCase;
+
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ClassObjectType;
+import org.drools.base.evaluators.ComparableEvaluatorsDefinition;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
+import org.drools.base.evaluators.EvaluatorRegistry;
+import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.StringFactory;
+import org.drools.base.evaluators.SetEvaluatorsDefinition;
+import org.drools.base.evaluators.SoundslikeEvaluatorsDefinition;
 import org.drools.reteoo.BetaMemory;
 import org.drools.rule.Declaration;
 import org.drools.rule.Pattern;
@@ -24,9 +31,16 @@
 import org.drools.util.AbstractHashTable.FieldIndex;
 import org.drools.util.AbstractHashTable.Index;
 
-import junit.framework.TestCase;
-
 public abstract class BaseBetaConstraintsTest extends TestCase {
+    
+    public static EvaluatorRegistry registry = new EvaluatorRegistry();
+    static {
+        registry.addEvaluatorDefinition( new EqualityEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new ComparableEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new SetEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new MatchesEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new SoundslikeEvaluatorsDefinition() );
+    }
 
     protected BetaNodeFieldConstraint getConstraint(String identifier,
                                                     Operator operator,
@@ -39,7 +53,10 @@
                                                    extractor,
                                                    new Pattern( 0,
                                                                 new ClassObjectType( clazz ) ) );
-        Evaluator evaluator = StringFactory.getInstance().getEvaluator( operator );
+        Evaluator evaluator = registry.getEvaluatorDefinition( operator.getOperatorString() ).getEvaluator( extractor.getValueType(), 
+                                                                                                            operator.getOperatorString(), 
+                                                                                                            operator.isNegated(), 
+                                                                                                            null );
         return new VariableConstraint( extractor,
                                        declaration,
                                        evaluator );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/EqualityKeyTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/EqualityKeyTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/EqualityKeyTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -10,13 +10,13 @@
     public void test1() {
         ReteooFactHandleFactory factory = new ReteooFactHandleFactory();
         
-        InternalFactHandle ch1 = factory.newFactHandle( new Cheese ("c", 10) );
+        InternalFactHandle ch1 = factory.newFactHandle( new Cheese ("c", 10), false, null );
         EqualityKey key = new EqualityKey( ch1 );
         
         assertSame( ch1, key.getFactHandle() );
         assertNull( key.getOtherFactHandle() );
         
-        InternalFactHandle ch2 = factory.newFactHandle( new Cheese ("c", 10) );
+        InternalFactHandle ch2 = factory.newFactHandle( new Cheese ("c", 10), false, null );
         key.addFactHandle( ch2 );
         
         assertEquals( 1, key.getOtherFactHandle().size() );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/TripleBetaConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/TripleBetaConstraintsTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/TripleBetaConstraintsTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,30 +1,9 @@
 package org.drools.common;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.drools.Cheese;
-import org.drools.RuleBaseConfiguration;
-import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ClassObjectType;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.StringFactory;
-import org.drools.reteoo.BetaMemory;
-import org.drools.rule.Declaration;
-import org.drools.rule.Pattern;
 import org.drools.rule.VariableConstraint;
-import org.drools.spi.BetaNodeFieldConstraint;
-import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
-import org.drools.util.FactHandleIndexHashTable;
-import org.drools.util.FactHashTable;
-import org.drools.util.TupleHashTable;
-import org.drools.util.TupleIndexHashTable;
-import org.drools.util.AbstractHashTable.FieldIndex;
-import org.drools.util.AbstractHashTable.Index;
 
-import junit.framework.TestCase;
-
 public class TripleBetaConstraintsTest extends BaseBetaConstraintsTest {
     
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -33,7 +33,13 @@
 import org.drools.base.FieldFactory;
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.ComparableEvaluatorsDefinition;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
+import org.drools.base.evaluators.EvaluatorRegistry;
+import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.SetEvaluatorsDefinition;
+import org.drools.base.evaluators.SoundslikeEvaluatorsDefinition;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Package;
 import org.drools.rule.Pattern;
@@ -47,6 +53,16 @@
  * @author <a href="mailto:simon at redhillconsulting.com.au">Simon Harris</a>
  */
 public class AgendaEventSupportTest extends TestCase {
+
+    public static EvaluatorRegistry registry = new EvaluatorRegistry();
+    static {
+        registry.addEvaluatorDefinition( new EqualityEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new ComparableEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new SetEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new MatchesEvaluatorsDefinition() );
+        registry.addEvaluatorDefinition( new SoundslikeEvaluatorsDefinition() );
+    }
+
     public void testIsSerializable() {
         assertTrue( Serializable.class.isAssignableFrom( AgendaEventSupport.class ) );
     }
@@ -68,7 +84,9 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = registry.getEvaluator( ValueType.STRING_TYPE,
+                                                           Operator.EQUAL,
+                                                           null );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -28,6 +28,7 @@
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Package;
@@ -72,7 +73,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = new EqualityEvaluatorsDefinition().getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL, null );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -33,22 +33,21 @@
 import junit.framework.TestCase;
 
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ClassObjectType;
-import org.drools.base.ShadowProxyFactory;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.base.field.BooleanFieldImpl;
 import org.drools.base.field.LongFieldImpl;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.rule.Pattern;
 import org.drools.rule.Declaration;
 import org.drools.rule.GroupElement;
 import org.drools.rule.GroupElementFactory;
 import org.drools.rule.InvalidRuleException;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Package;
+import org.drools.rule.Pattern;
 import org.drools.rule.Rule;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.AlphaNodeFieldConstraint;
@@ -113,12 +112,11 @@
         //shadow = ShadowProxyFactory.getProxy( Chosen.class );
         this.chosenType = new ClassObjectType( Chosen.class );
 
-        this.integerEqualEvaluator = ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL );
-        //this.integerNotEqualEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.NOT_EQUAL );
-        this.objectEqualEvaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
-        this.objectNotEqualEvaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.NOT_EQUAL );
-        this.booleanEqualEvaluator = ValueType.PBOOLEAN_TYPE.getEvaluator( Operator.EQUAL );
-        //this.booleanNotEqualEvaluator = ValueType.BOOLEAN_TYPE.getEvaluator( Operator.NOT_EQUAL );
+        EqualityEvaluatorsDefinition evals = new EqualityEvaluatorsDefinition();
+        this.integerEqualEvaluator = evals.getEvaluator( ValueType.PINTEGER_TYPE, Operator.EQUAL, null );
+        this.objectEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL, null );
+        this.objectNotEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE, Operator.NOT_EQUAL, null );
+        this.booleanEqualEvaluator = evals.getEvaluator( ValueType.PBOOLEAN_TYPE, Operator.EQUAL, null );
 
         this.pkg = new Package( "org.drools.examples.manners" );
         this.pkg.addRule( getAssignFirstSeatRule() );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AccumulateNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AccumulateNodeTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AccumulateNodeTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -128,10 +128,10 @@
                              0,
                              this.sink.getAsserted().size() );
 
-        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" ) ),
+        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null ) ),
                                this.context,
                                this.workingMemory );
-        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" ) ),
+        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null ) ),
                                this.context,
                                this.workingMemory );
 
@@ -155,7 +155,7 @@
      * Test method for {@link org.drools.reteoo.AccumulateNode#assertTuple(org.drools.reteoo.ReteTuple, org.drools.spi.PropagationContext, org.drools.reteoo.ReteooWorkingMemory)}.
      */
     public void testAssertTuple() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
         // assert tuple, should add one to left memory
@@ -171,7 +171,7 @@
                            this.accumulator.getMatchingObjects().isEmpty() );
 
         // assert tuple, should add left memory 
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple1 = new ReteTuple( f1 );
         this.node.assertTuple( tuple1,
@@ -195,8 +195,8 @@
      * Test method for {@link org.drools.reteoo.AccumulateNode#assertTuple(org.drools.reteoo.ReteTuple, org.drools.spi.PropagationContext, org.drools.reteoo.ReteooWorkingMemory)}.
      */
     public void testAssertTupleWithObjects() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -244,7 +244,7 @@
      * Test method for {@link org.drools.reteoo.AccumulateNode#retractTuple(org.drools.reteoo.ReteTuple, org.drools.spi.PropagationContext, org.drools.reteoo.ReteooWorkingMemory)}.
      */
     public void testRetractTuple() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -275,8 +275,8 @@
      * Test method for {@link org.drools.reteoo.AccumulateNode#assertObject(InternalFactHandle, org.drools.spi.PropagationContext, InternalWorkingMemory)}.
      */
     public void testAssertObject() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -320,8 +320,8 @@
      * Test method for {@link org.drools.reteoo.AccumulateNode#retractObject(InternalFactHandle, org.drools.spi.PropagationContext, InternalWorkingMemory)}.
      */
     public void testRetractObject() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -431,8 +431,8 @@
         
         this.memory = ((AccumulateMemory) this.workingMemory.getNodeMemory( this.node )).betaMemory;
 
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -27,6 +27,7 @@
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.PropagationContextImpl;
@@ -42,6 +43,7 @@
 public class AlphaNodeTest extends DroolsTestCase {
 
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testMemory() {
         RuleBaseConfiguration config = new RuleBaseConfiguration();
@@ -83,7 +85,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -170,7 +172,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -233,7 +235,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -320,7 +322,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -407,7 +409,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -475,7 +477,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -559,7 +561,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -647,7 +649,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );
@@ -731,7 +733,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.OBJECT_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
                                                                     field );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CollectNodeTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -125,10 +125,10 @@
                              0,
                              this.sink.getAsserted().size() );
 
-        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" ) ),
+        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null ) ),
                                this.contextAssert,
                                this.workingMemory );
-        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" ) ),
+        this.node.assertTuple( new ReteTuple( this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null ) ),
                                this.contextAssert,
                                this.workingMemory );
 
@@ -149,7 +149,7 @@
     }
 
     public void testAssertTuple() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
         // assert tuple, should add one to left memory
@@ -165,7 +165,7 @@
                            ((Collection) ((DefaultFactHandle) ((Tuple) ((Object[]) this.sink.getAsserted().get( 0 ))[0]).get( 1 )).getObject()).isEmpty() );
 
         // assert tuple, should add left memory 
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple1 = new ReteTuple( f1 );
         this.node.assertTuple( tuple1,
@@ -185,8 +185,8 @@
     }
 
     public void testAssertTupleWithObjects() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -230,7 +230,7 @@
     }
 
     public void testRetractTuple() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -258,8 +258,8 @@
     }
 
     public void testAssertObject() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -302,8 +302,8 @@
     }
 
     public void testRetractObject() {
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 
@@ -395,8 +395,8 @@
         this.memory = (BetaMemory) this.workingMemory.getNodeMemory( this.node );
         this.node.setTupleMemoryEnabled( false );
 
-        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese" );
-        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese" );
+        final DefaultFactHandle f0 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "cheese", false, null );
+        final DefaultFactHandle f1 = (DefaultFactHandle) this.workingMemory.getFactHandleFactory().newFactHandle( "other cheese", false, null );
 
         final ReteTuple tuple0 = new ReteTuple( f0 );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -8,9 +8,8 @@
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ValueType;
-import org.drools.base.evaluators.CharacterFactory;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.StringFactory;
 import org.drools.base.field.LongFieldImpl;
 import org.drools.base.field.ObjectFieldImpl;
 import org.drools.common.EmptyBetaConstraints;
@@ -25,6 +24,8 @@
 public class CompositeObjectSinkAdapterTest extends TestCase {
     private ReteooRuleBase ruleBase;
     private BuildContext   buildContext;
+    
+    private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     protected void setUp() throws Exception {
         this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
@@ -89,7 +90,7 @@
 
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
         final LiteralConstraint lit = new LiteralConstraint( new MockExtractor(),
-                                                             StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                             equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                              new ObjectFieldImpl( "stilton" ) );
         final AlphaNode al = new AlphaNode( buildContext.getNextId(),
                                             lit,
@@ -115,7 +116,7 @@
 
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
         final LiteralConstraint lit = new LiteralConstraint( new MockExtractor(),
-                                                             StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                             equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                              new ObjectFieldImpl( "stilton" ) );
         final AlphaNode al = new AlphaNode( buildContext.getNextId(),
                                             lit,
@@ -132,7 +133,7 @@
                       ad.getSinks()[0] );
 
         final LiteralConstraint lit2 = new LiteralConstraint( new MockExtractor(),
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "cheddar" ) );
         final AlphaNode al2 = new AlphaNode( buildContext.getNextId(),
                                              lit2,
@@ -177,7 +178,7 @@
                                                                                         this.getClass().getClassLoader() );
         
         final LiteralConstraint lit = new LiteralConstraint( extractor,
-                                                             StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                             equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                              new ObjectFieldImpl( "stilton" ) );
         final AlphaNode al = new AlphaNode( buildContext.getNextId(),
                                             lit,
@@ -194,7 +195,7 @@
                       ad.getSinks()[0] );
 
         final LiteralConstraint lit2 = new LiteralConstraint( extractor,
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "cheddar" ) );
         final AlphaNode al2 = new AlphaNode( buildContext.getNextId(),
                                              lit2,
@@ -208,7 +209,7 @@
                       ad.hashableSinks.size() );
 
         final LiteralConstraint lit3 = new LiteralConstraint( extractor,
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "stinky" ) );
         final AlphaNode al3 = new AlphaNode( buildContext.getNextId(),
                                              lit3,
@@ -236,7 +237,7 @@
                                                                                         this.getClass().getClassLoader() );
         
         final LiteralConstraint lit = new LiteralConstraint( extractor,
-                                                             CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                             equals.getEvaluator( extractor.getValueType(), Operator.EQUAL ),
                                                              new LongFieldImpl( 65 ) ); // chars are handled as integers
         final AlphaNode al = new AlphaNode( buildContext.getNextId(),
                                             lit,
@@ -253,7 +254,7 @@
                       ad.getSinks()[0] );
 
         final LiteralConstraint lit2 = new LiteralConstraint( extractor,
-                                                              CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( extractor.getValueType(), Operator.EQUAL ),
                                                               new LongFieldImpl( 66 ) );
         final AlphaNode al2 = new AlphaNode( buildContext.getNextId(),
                                              lit2,
@@ -267,7 +268,7 @@
                       ad.hashableSinks.size() );
 
         final LiteralConstraint lit3 = new LiteralConstraint( extractor,
-                                                              CharacterFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( extractor.getValueType(), Operator.EQUAL ),
                                                               new LongFieldImpl( 67 ) );
         final AlphaNode al3 = new AlphaNode( buildContext.getNextId(),
                                              lit3,
@@ -315,7 +316,7 @@
                                                                                         "type",
                                                                                         this.getClass().getClassLoader() );
         final LiteralConstraint lit1 = new LiteralConstraint( extractor,
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "stilton" ) );
         final AlphaNode al1 = new AlphaNode( buildContext.getNextId(),
                                              lit1,
@@ -323,7 +324,7 @@
                                              buildContext );
 
         final LiteralConstraint lit2 = new LiteralConstraint( extractor,
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "brie" ) );
         final AlphaNode al2 = new AlphaNode( buildContext.getNextId(),
                                              lit2,
@@ -331,7 +332,7 @@
                                              buildContext );
 
         final LiteralConstraint lit3 = new LiteralConstraint( extractor,
-                                                              StringFactory.getInstance().getEvaluator( Operator.EQUAL ),
+                                                              equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                               new ObjectFieldImpl( "muzzarela" ) );
         final AlphaNode al3 = new AlphaNode( buildContext.getNextId(),
                                              lit3,
@@ -342,7 +343,7 @@
         ad.addObjectSink( al2 );
         ad.addObjectSink( al3 );
 
-        InternalFactHandle handle = new ReteooFactHandleFactory().newFactHandle( new Cheese() );
+        InternalFactHandle handle = new ReteooFactHandleFactory().newFactHandle( new Cheese(), false, null );
         try {
             ad.propagateAssertObject( handle,
                                       null,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/DefaultFactHandleFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/DefaultFactHandleFactoryTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/DefaultFactHandleFactoryTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -27,21 +27,21 @@
      */
     public void testNewFactHandle() {
         final ReteooFactHandleFactory factory = new ReteooFactHandleFactory();
-        DefaultFactHandle handle = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        DefaultFactHandle handle = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 0,
                       handle.getId() );
         assertEquals( 0,
                       handle.getRecency() );
 
         // issue  new handle
-        handle = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        handle = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 1,
                       handle.getId() );
         assertEquals( 1,
                       handle.getRecency() );
 
         // issue  new handle, under a different reference so we  can destroy later        
-        final DefaultFactHandle handle2 = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        final DefaultFactHandle handle2 = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 2,
                       handle2.getId() );
         assertEquals( 2,
@@ -53,7 +53,7 @@
                       handle.getRecency() );
 
         // issue new handle and make sure  recency is still inline
-        handle = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        handle = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 3,
                       handle.getId() );
         assertEquals( 4,
@@ -63,14 +63,14 @@
         factory.destroyFactHandle( handle2 );
 
         // issue  new  fact handle and  make sure it  recycled the  id=2
-        handle = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        handle = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 2,
                       handle.getId() );
         assertEquals( 5,
                       handle.getRecency() );
 
         // issue new  handle  making  sure it correctly resumes  ids  and recency
-        handle = (DefaultFactHandle) factory.newFactHandle( "cheese" );
+        handle = (DefaultFactHandle) factory.newFactHandle( "cheese", false, null );
         assertEquals( 4,
                       handle.getId() );
         assertEquals( 6,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -17,6 +17,7 @@
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.BetaConstraints;
 import org.drools.common.DefaultFactHandle;
@@ -37,6 +38,7 @@
 
 public class FromNodeTest extends TestCase {
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testAlphaNode() {
         final PropagationContext context = new PropagationContextImpl( 0,
@@ -51,7 +53,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "stilton" );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
-                                                                    ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL ),
+                                                                    equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                                     field );
 
         final List list = new ArrayList();
@@ -154,7 +156,7 @@
 
         final VariableConstraint variableConstraint = new VariableConstraint( priceExtractor,
                                                                               declaration,
-                                                                              ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL ) );
+                                                                              equals.getEvaluator( ValueType.PINTEGER_TYPE, Operator.EQUAL ) );
         final RuleBaseConfiguration configuration = new RuleBaseConfiguration();
         configuration.setIndexRightBetaMemory( false );
         configuration.setIndexLeftBetaMemory( false );
@@ -248,7 +250,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "stilton" );
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
-                                                                    ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL ),
+                                                                    equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ),
                                                                     field );
 
         final List list = new ArrayList();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeConfTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -1,6 +1,5 @@
 package org.drools.reteoo;
 
-import org.drools.reteoo.Rete.ClassObjectTypeConf;
 
 import junit.framework.TestCase;
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -34,6 +34,7 @@
 import org.drools.base.DroolsQuery;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.EmptyBetaConstraints;
 import org.drools.reteoo.builder.BuildContext;
@@ -47,6 +48,7 @@
     private BuildContext     buildContext;
 
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     protected void setUp() throws Exception {
         this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
@@ -67,7 +69,7 @@
 
         FieldValue field = FieldFactory.getFieldValue( "query-1" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL );
         LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                               evaluator,
                                                               field );

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -22,6 +22,7 @@
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.drools.Cheese;
@@ -35,8 +36,6 @@
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
-import org.drools.reteoo.Rete.ClassObjectTypeConf;
-import org.drools.reteoo.Rete.ObjectTypeConf;
 import org.drools.reteoo.ReteooBuilder.IdGenerator;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.spi.PropagationContext;
@@ -135,7 +134,7 @@
                                                        null ),
                            workingMemory );
 
-        final ObjectHashMap map = (ObjectHashMap) workingMemory.getNodeMemory( rete );
+        final Map map = workingMemory.getObjectTypeConfMap();
         ClassObjectTypeConf conf = (ClassObjectTypeConf) map.get( ArrayList.class );
         assertLength( 3,
                       conf.getObjectTypeNodes() );
@@ -239,7 +238,7 @@
                     rete.getObjectTypeNodes().get( new ClassObjectType( List.class ) ) );
 
         // ArrayConf should match two ObjectTypenodes for List and ArrayList
-        ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( rete );
+        Map memory = workingMemory.getObjectTypeConfMap();
         ObjectTypeConf arrayConf = (ObjectTypeConf) memory.get( ArrayList.class );
         final ObjectTypeNode arrayOtn = arrayConf.getConcreteObjectTypeNode();
         assertEquals( 2,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -30,6 +30,8 @@
 import org.drools.base.FieldFactory;
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
+import org.drools.base.evaluators.ComparableEvaluatorsDefinition;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -47,6 +49,8 @@
 public class FieldConstraintTest extends TestCase {
 
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
+    ComparableEvaluatorsDefinition comparables = new ComparableEvaluatorsDefinition();
 
     public FieldConstraintTest() {
         super();
@@ -76,7 +80,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
@@ -88,7 +92,7 @@
         final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.insert( cheddar );
 
         // check constraint
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         final Cheese stilton = new Cheese( "stilton",
@@ -97,7 +101,7 @@
         final InternalFactHandle stiltonHandle = (InternalFactHandle) workingMemory.insert( stilton );
 
         // check constraint
-        assertFalse( constraint.isAllowed( stiltonHandle.getObject(),
+        assertFalse( constraint.isAllowed( stiltonHandle,
                                            workingMemory ) );
     }
 
@@ -122,7 +126,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( 5 );
 
-        final Evaluator evaluator = ValueType.PINTEGER_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.PINTEGER_TYPE, Operator.EQUAL );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
@@ -134,7 +138,7 @@
         final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.insert( cheddar );
 
         // check constraint
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         final Cheese stilton = new Cheese( "stilton",
@@ -143,7 +147,7 @@
         final InternalFactHandle stiltonHandle = (InternalFactHandle) workingMemory.insert( stilton );
 
         // check constraint
-        assertFalse( constraint.isAllowed( stiltonHandle.getObject(),
+        assertFalse( constraint.isAllowed( stiltonHandle,
                                            workingMemory ) );
     }
 
@@ -228,7 +232,7 @@
         context.updateFromTuple( workingMemory,
                                  tuple );
         assertTrue( constraint1.isAllowedCachedLeft( context,
-                                                     f1.getObject() ) );
+                                                     f1 ) );
     }
 
     /**
@@ -284,7 +288,7 @@
                                                                                 new Declaration[]{priceDeclaration},
                                                                                 new Declaration[0],
                                                                                 new String[0],
-                                                                                ValueType.INTEGER_TYPE.getEvaluator( Operator.EQUAL ) );
+                                                                                equals.getEvaluator( ValueType.INTEGER_TYPE, Operator.EQUAL ) );
 
         final ReturnValueConstraint constraint1 = new ReturnValueConstraint( priceExtractor,
                                                                              restriction1 );
@@ -294,7 +298,7 @@
                                                                                 new Declaration[]{priceDeclaration},
                                                                                 new Declaration[0],
                                                                                 new String[0],
-                                                                                ValueType.INTEGER_TYPE.getEvaluator( Operator.GREATER ) );
+                                                                                comparables.getEvaluator( ValueType.INTEGER_TYPE, Operator.GREATER ) );
 
         final ReturnValueConstraint constraint2 = new ReturnValueConstraint( priceExtractor,
                                                                              restriction2 );
@@ -315,13 +319,13 @@
         context1.updateFromTuple( workingMemory,
                                   tuple );
         assertTrue( constraint1.isAllowedCachedLeft( context1,
-                                                     f1.getObject() ) );
+                                                     f1 ) );
 
         final ReturnValueContextEntry context2 = (ReturnValueContextEntry) constraint2.getContextEntry();
         context2.updateFromTuple( workingMemory,
                                   tuple );
         assertFalse( constraint2.isAllowedCachedLeft( context2,
-                                                      f1.getObject() ) );
+                                                      f1 ) );
 
         final Cheese cheddar2 = new Cheese( "cheddar",
                                             11 );
@@ -329,7 +333,7 @@
         final InternalFactHandle f2 = (InternalFactHandle) workingMemory.insert( cheddar2 );
 
         assertTrue( constraint2.isAllowedCachedLeft( context2,
-                                                     f2.getObject() ) );
+                                                     f2 ) );
     }
 
     /**
@@ -356,7 +360,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL );
 
         final LiteralConstraint constraint1 = new LiteralConstraint( extractor,
                                                                      evaluator,
@@ -368,7 +372,7 @@
 
         final FieldValue priceField = FieldFactory.getFieldValue( 10 );
 
-        final Evaluator priceEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.GREATER );
+        final Evaluator priceEvaluator = comparables.getEvaluator( ValueType.INTEGER_TYPE, Operator.GREATER );
 
         final LiteralConstraint constraint2 = new LiteralConstraint( priceExtractor,
                                                                      priceEvaluator,
@@ -384,22 +388,22 @@
         final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.insert( cheddar );
 
         // check constraint
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         cheddar.setPrice( 5 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
 
         cheddar.setType( "stilton" );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
 
         cheddar.setPrice( 15 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
     }
 
@@ -426,7 +430,7 @@
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator evaluator = equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL );
 
         final LiteralConstraint constraint1 = new LiteralConstraint( extractor,
                                                                      evaluator,
@@ -438,7 +442,7 @@
 
         final FieldValue priceField = FieldFactory.getFieldValue( 10 );
 
-        final Evaluator priceEvaluator = ValueType.INTEGER_TYPE.getEvaluator( Operator.GREATER );
+        final Evaluator priceEvaluator = comparables.getEvaluator( ValueType.INTEGER_TYPE, Operator.GREATER );
 
         final LiteralConstraint constraint2 = new LiteralConstraint( priceExtractor,
                                                                      priceEvaluator,
@@ -454,22 +458,22 @@
         final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.insert( cheddar );
 
         // check constraint
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         cheddar.setPrice( 5 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         cheddar.setType( "stilton" );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
 
         cheddar.setPrice( 15 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
     }
 
@@ -496,7 +500,7 @@
 
         final FieldValue cheddarField = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator stringEqual = ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL );
+        final Evaluator stringEqual = equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL );
 
         // type == 'cheddar'
         final LiteralConstraint constraint1 = new LiteralConstraint( typeExtractor,
@@ -509,7 +513,7 @@
 
         final FieldValue field10 = FieldFactory.getFieldValue( 10 );
 
-        final Evaluator integerGreater = ValueType.INTEGER_TYPE.getEvaluator( Operator.GREATER );
+        final Evaluator integerGreater =  comparables.getEvaluator( ValueType.INTEGER_TYPE, Operator.GREATER );
 
         // price > 10
         final LiteralConstraint constraint2 = new LiteralConstraint( priceExtractor,
@@ -527,7 +531,7 @@
                                                                      stringEqual,
                                                                      stiltonField );
 
-        final Evaluator integerLess = ValueType.INTEGER_TYPE.getEvaluator( Operator.LESS );
+        final Evaluator integerLess =  comparables.getEvaluator( ValueType.INTEGER_TYPE, Operator.LESS );
 
         // price < 10
         final LiteralConstraint constraint4 = new LiteralConstraint( priceExtractor,
@@ -550,22 +554,22 @@
         final InternalFactHandle cheddarHandle = (InternalFactHandle) workingMemory.insert( cheddar );
 
         // check constraint
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         cheddar.setPrice( 5 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
 
         cheddar.setType( "stilton" );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertTrue( constraint.isAllowed( cheddarHandle.getObject(),
+        assertTrue( constraint.isAllowed( cheddarHandle,
                                           workingMemory ) );
 
         cheddar.setPrice( 15 );
         ((ShadowProxy) cheddarHandle.getObject()).updateProxy();
-        assertFalse( constraint.isAllowed( cheddarHandle.getObject(),
+        assertFalse( constraint.isAllowed( cheddarHandle,
                                            workingMemory ) );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockConstraint.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -36,7 +36,7 @@
 
     public boolean            isAllowed        = true;
 
-    public boolean isAllowed(final Object object,
+    public boolean isAllowed(final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory) {
         return this.isAllowed;
@@ -78,7 +78,7 @@
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
-                                       final Object object) {
+                                       final InternalFactHandle handle) {
         return this.isAllowed;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/spi/MockObjectType.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -39,6 +39,8 @@
     private static final long serialVersionUID = 400L;
     /** Java object class. */
     private boolean           matches;
+    
+    private boolean           isEvent;
 
     // ------------------------------------------------------------
     // Constructors
@@ -88,4 +90,12 @@
         return ValueType.OBJECT_TYPE;
     }
 
+    public boolean isEvent() {
+        return isEvent;
+    }
+
+    public void setEvent(boolean isEvent) {
+        this.isEvent = isEvent;
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -5,8 +5,9 @@
 import org.drools.Cheese;
 import org.drools.base.ClassFieldExtractor;
 import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.StringFactory;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.util.AbstractHashTable.FactEntryImpl;
@@ -16,6 +17,7 @@
 
 public class FieldIndexEntryTest extends TestCase {
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testSingleEntry() {
         final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
@@ -24,7 +26,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       null,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
         final SingleIndex singleIndex = new SingleIndex( new FieldIndex[]{fieldIndex},
                                                          1 );
 
@@ -67,7 +69,7 @@
                                                                   getClass().getClassLoader() );
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       null,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
         final SingleIndex singleIndex = new SingleIndex( new FieldIndex[]{fieldIndex},
                                                          1 );
 
@@ -119,7 +121,7 @@
                                                                   getClass().getClassLoader() );
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       null,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
         final SingleIndex singleIndex = new SingleIndex( new FieldIndex[]{fieldIndex},
                                                          1 );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexHashTableTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -9,9 +9,9 @@
 import org.drools.Cheese;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.base.ClassObjectType;
-import org.drools.base.evaluators.ObjectFactory;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.evaluators.StringFactory;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.ReteTuple;
@@ -25,6 +25,7 @@
 
 public class FieldIndexHashTableTest extends TestCase {
     ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testSingleEntry() throws Exception {
         final FieldExtractor extractor = cache.getExtractor( Cheese.class,
@@ -40,7 +41,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -89,7 +90,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -146,7 +147,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -203,7 +204,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      ObjectFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -250,7 +251,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -317,7 +318,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 
@@ -534,7 +535,7 @@
 
         final FieldIndex fieldIndex = new FieldIndex( extractor,
                                                       declaration,
-                                                      StringFactory.getInstance().getEvaluator( Operator.EQUAL ) );
+                                                      equals.getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL ) );
 
         final FactHandleIndexHashTable map = new FactHandleIndexHashTable( new FieldIndex[]{fieldIndex} );
 

Modified: labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-decisiontables/src/test/java/org/drools/decisiontable/parser/ExternalSheetListenerTest.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -29,6 +29,7 @@
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.AsyncExceptionHandler;
 import org.drools.spi.GlobalResolver;
+import org.drools.temporal.SessionClock;
 
 public class ExternalSheetListenerTest extends TestCase {
 
@@ -402,6 +403,12 @@
                     // TODO Auto-generated method stub
                     return null;
                 }
+
+                public SessionClock getSessionClock() {
+                    // TODO Auto-generated method stub
+                    return null;
+                }
+
 			};
 		}
 	}

Copied: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94EventFactHandle.java (from rev 17159, labs/jbossrules/branches/temporal_rete/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94EventFactHandle.java)
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94EventFactHandle.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94EventFactHandle.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -0,0 +1,106 @@
+package org.drools.jsr94.rules;
+
+/*
+ * $Id: Jsr94FactHandle.java,v 1.14 2005/02/04 02:13:38 mproctor Exp $
+ *
+ * Copyright 2003-2004 (C) The Werken Company. All Rights Reserved.
+ *
+ * Redistribution and use of this software and associated documentation
+ * ("Software"), with or without modification, are permitted provided that the
+ * following conditions are met:
+ *
+ * 1. Redistributions of source code must retain copyright statements and
+ * notices. Redistributions must also contain a copy of this document.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name "drools" must not be used to endorse or promote products derived
+ * from this Software without prior written permission of The Werken Company.
+ * For written permission, please contact bob at werken.com.
+ *
+ * 4. Products derived from this Software may not be called "drools" nor may
+ * "drools" appear in their names without prior written permission of The Werken
+ * Company. "drools" is a registered trademark of The Werken Company.
+ *
+ * 5. Due credit should be given to The Werken Company.
+ * (http://drools.werken.com/).
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE WERKEN COMPANY AND CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE WERKEN COMPANY OR ITS CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+import javax.rules.Handle;
+
+import org.drools.common.EventFactHandle;
+
+/**
+ * The Drools implementation of the <code>Handle</code> interface which provides
+ * a marker interface for Drools-specific object identity mechanism. When using
+ * the <code>StatefulRuleSession</code> objects that are added to rule session
+ * state are identified using a Drools-supplied <code>Handle</code>
+ * implementation.
+ * <p/>
+ * <code>Handle</code>s are used to unambigiously identify objects within the
+ * rule session state and should not suffer many of the object identity issues
+ * that arise when using muliple class loaders, serializing
+ * <code>StatefulRuleSessions</code>, or using <code>Object.equals</code> or
+ * <code>object1 == object2</code> reference equality.
+ */
+public class Jsr94EventFactHandle extends EventFactHandle
+    implements
+    Handle {
+
+    private static final long serialVersionUID = -7338909470403134407L;
+
+    /**
+     * Constructs a new <code>Handle</code>.
+     *
+     * @param id A unique <code>Handle</code> id.
+     * @param recency A value indicating the recency of this <code>Handle</code>
+     *        (more recently created <code>Handle</code>s have greater values
+     *         than <code>Handle</code>s created further in the past)
+     *
+     * @see org.drools.conflict.RecencyConflictResolver
+     */
+    Jsr94EventFactHandle(final long id,
+                         final Object object,
+                         final long recency) {
+        super( id,
+               object,
+               recency );
+    }
+
+    /**
+     * Creates a new event fact handle.
+     * 
+     * @param id this event fact handle ID
+     * @param object the event object encapsulated in this event fact handle
+     * @param recency the recency of this event fact handle
+     * @param timestamp the timestamp of the occurence of this event
+     * @param duration the duration of this event. May be 0 (zero) in case this is a primitive event.
+     */
+    public Jsr94EventFactHandle(final long id,
+                                final Object object,
+                                final long recency,
+                                final long timestamp,
+                                final long duration) {
+        super( id,
+               object,
+               recency,
+               timestamp,
+               duration );
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandle.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandle.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -61,6 +61,9 @@
 public class Jsr94FactHandle extends DefaultFactHandle
     implements
     Handle {
+
+    private static final long serialVersionUID = 7664394510847222696L;
+
     /**
      * Constructs a new <code>Handle</code>.
      *

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2007-12-10 17:11:42 UTC (rev 17160)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2007-12-10 18:37:22 UTC (rev 17161)
@@ -16,10 +16,12 @@
  * limitations under the License.
  */
 
+import org.drools.TemporalSession;
+import org.drools.WorkingMemory;
 import org.drools.common.AbstractFactHandleFactory;
-import org.drools.common.DefaultFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.spi.FactHandleFactory;
+import org.drools.temporal.SessionClock;
 
 /**
  * A factory for creating <code>Handle</code>s.
@@ -27,15 +29,29 @@
  */
 public final class Jsr94FactHandleFactory extends AbstractFactHandleFactory {
 
+
+    private static final long serialVersionUID = 4964273923122006124L;
+
     /* (non-Javadoc)
      * @see org.drools.reteoo.FactHandleFactory#newFactHandle(long)
      */
     protected final InternalFactHandle newFactHandle(final long id,
                                                      final Object object,
-                                                     final long recency) {
-        return new Jsr94FactHandle( id,
-                                    object,
-                                    recency );
+                                                     final long recency,
+                                                     final boolean isEvent,
+                                                     final WorkingMemory workingMemory ) {
+        if ( isEvent ) {
+            SessionClock clock = ((TemporalSession) workingMemory).getSessionClock(); 
+            return new Jsr94EventFactHandle( id,
+                                             object,
+                                             recency,
+                                             clock.getCurrentTime(),
+                                             0 ); // for now, we are only handling primitive events
+        } else {
+            return new Jsr94FactHandle( id,
+                                        object,
+                                        recency );
+        }
     }
 
     /* (non-Javadoc)




More information about the jboss-svn-commits mailing list