/**
* Copyright 2010 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.
*/
package org.drools.base.evaluators;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
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.ObjectVariableContextEntry;
import org.drools.rule.VariableRestriction.VariableContextEntry;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldValue;
import org.drools.spi.InternalReadAccessor;
/**
* 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 = 510l;
{
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.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 );
}
};
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
evaluators = (EvaluatorCache) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject( evaluators );
}
/**
* @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.getEvaluator( type,
operatorId,
isNegated,
parameterText,
Target.FACT,
Target.FACT );
}
/**
* @inheritDoc
*/
public Evaluator getEvaluator(final ValueType type,
final String operatorId,
final boolean isNegated,
final String parameterText,
final Target left,
final Target right) {
return this.evaluators.getEvaluator( type,
Operator.determineOperator( operatorId,
isNegated ) );
}
public String[] getEvaluatorIds() {
return SUPPORTED_IDS;
}
public boolean isNegatable() {
return true;
}
public Target getTarget() {
return Target.FACT;
}
public boolean supportsType(ValueType type) {
return this.evaluators.supportsType( type );
}
private static ObjectArrayContainsEvaluator objectArrayEvaluator = new ObjectArrayContainsEvaluator();
private static Map<Class, ArrayContains> primitiveArrayEvaluator = new HashMap() {
{
put( boolean[].class,
new BooleanArrayContainsEvaluator() );
put( byte[].class,
new ByteArrayContainsEvaluator() );
put( short[].class,
new ShortArrayContainsEvaluator() );
put( char[].class,
new CharArrayContainsEvaluator() );
put( int[].class,
new IntegerArrayContainsEvaluator() );
put( long[].class,
new LongArrayContainsEvaluator() );
put( float[].class,
new FloatArrayContainsEvaluator() );
put( double[].class,
new DoubleArrayContainsEvaluator() );
}
};
public static ArrayContains getArrayContains(Class cls) {
ArrayContains eval = primitiveArrayEvaluator.get( cls );
if ( eval == null ) {
eval = objectArrayEvaluator;
}
return eval;
}
/*
* Evaluator Implementations
*/
public static class ArrayContainsEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ArrayContainsEvaluator();
public ArrayContainsEvaluator() {
super( ValueType.ARRAY_TYPE,
CONTAINS );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
final Object array = extractor.getValue( workingMemory,
object1 );
if ( array == null ) return false;
return getArrayContains( array.getClass() ).contains( array,
object2 );
}
public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
final VariableContextEntry context,
final Object left) {
final Object array = ((ObjectVariableContextEntry) context).right;
if ( array == null ) return false;
return getArrayContains( array.getClass() ).contains( array,
workingMemory,
context.declaration.getExtractor(),
left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context,
final Object right) {
final Object array = context.extractor.getValue( workingMemory,
right );
if ( array == null ) return false;
return getArrayContains( array.getClass() ).contains( array,
workingMemory,
context.declaration.getExtractor(),
context.reteTuple.get( context.declaration ).getObject() );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object array = extractor1.getValue( workingMemory,
object1 );
if ( array == null ) return false;
return getArrayContains( array.getClass() ).contains( array,
workingMemory,
extractor2,
object2 );
}
public String toString() {
return "Array contains";
}
}
public static class ArrayExcludesEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ArrayExcludesEvaluator();
public ArrayExcludesEvaluator() {
super( ValueType.ARRAY_TYPE,
EXCLUDES );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
final Object array = extractor.getValue( workingMemory,
object1 );
if ( array == null ) return false;
return !getArrayContains( array.getClass() ).contains( array,
object2 );
}
public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
final VariableContextEntry context,
final Object left) {
final Object array = ((ObjectVariableContextEntry) context).right;
if ( array == null ) return false;
return !getArrayContains( array.getClass() ).contains( array,
workingMemory,
context.declaration.getExtractor(),
left );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context,
final Object right) {
final Object array = context.extractor.getValue( workingMemory,
right );
if ( array == null ) return false;
return !getArrayContains( array.getClass() ).contains( array,
workingMemory,
context.declaration.getExtractor(),
context.getTuple().get( context.getVariableDeclaration() ).getObject() );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object array = extractor1.getValue( workingMemory,
object1 );
if ( array == null ) return false;
return !getArrayContains( array.getClass() ).contains( array,
workingMemory,
extractor2,
object2 );
}
public String toString() {
return "Array not contains";
}
}
private static boolean contains(Object[] array,
Object value) {
for ( int i = 0; i < array.length; i++ ) {
if ( array[i] == null && value == null || array[i] != null && array[i].equals( value ) ) {
return true;
}
}
return false;
}
public static abstract class BaseMemberOfEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 510l;
public BaseMemberOfEvaluator() {
super( null,
null );
}
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 InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
if ( object2.isNull() ) {
return false;
} else if ( object2.isCollectionField() ) {
final Collection col = (Collection) object2.getValue();
final Object value = extractor.getValue( workingMemory,
object1 );
return col.contains( value );
} else if ( object2.getValue().getClass().isArray() ) {
return getArrayContains( object2.getValue().getClass() ).contains( object2.getValue(),
workingMemory,
extractor,
object1 );
} else {
throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object2.getValue().getClass() );
}
}
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 ) {
final Collection col = (Collection) object;
final Object value = ((ObjectVariableContextEntry) context).right;
return col.contains( value );
} else if ( object.getClass().isArray() ) {
return getArrayContains( object.getClass() ).contains( object,
workingMemory,
context.extractor,
context.object );
} else {
throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
}
}
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 ) {
final Collection col = (Collection) object;
final Object value = context.extractor.getValue( workingMemory,
right );
return col.contains( value );
} else if ( object.getClass().isArray() ) {
return getArrayContains( object.getClass() ).contains( object,
workingMemory,
context.extractor,
right );
} else {
throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
}
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object object = extractor2.getValue( workingMemory,
object2 );
if ( object == null ) {
return false;
} else if ( object instanceof Collection ) {
final Collection col = (Collection) object;
final Object value = extractor1.getValue( workingMemory,
object1 );
return col.contains( value );
} else if ( object.getClass().isArray() ) {
return getArrayContains( object.getClass() ).contains( object,
workingMemory,
extractor1,
object1 );
} else {
throw new ClassCastException( "Can't check if an attribute is member of an object of class " + object.getClass() );
}
}
public abstract String toString();
}
public static abstract class BaseNotMemberOfEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 510l;
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 InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
if ( object2.isNull() ) {
return false;
} else if ( object2.isCollectionField() ) {
final Collection col = (Collection) object2.getValue();
final Object value = extractor.getValue( workingMemory,
object1 );
return !col.contains( value );
} else if ( object2.getValue().getClass().isArray() ) {
return !getArrayContains( object2.getValue().getClass() ).contains( object2.getValue(),
workingMemory,
extractor,
object1 );
} else {
throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object2.getValue().getClass() );
}
}
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 ) {
final Collection col = (Collection) object;
final Object value = ((ObjectVariableContextEntry) context).right;
return !col.contains( value );
} else if ( object.getClass().isArray() ) {
return !getArrayContains( object.getClass() ).contains( object,
workingMemory,
context.extractor,
context.object );
} else {
throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
}
}
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 ) {
final Collection col = (Collection) object;
final Object value = context.extractor.getValue( workingMemory,
right );
return !col.contains( value );
} else if ( object.getClass().isArray() ) {
return !getArrayContains( object.getClass() ).contains( object,
workingMemory,
context.extractor,
right );
} else {
throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
}
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object object = extractor2.getValue( workingMemory,
object2 );
if ( object == null ) {
return false;
} else if ( object instanceof Collection ) {
final Collection col = (Collection) object;
final Object value = extractor1.getValue( workingMemory,
object1 );
return !col.contains( value );
} else if ( object.getClass().isArray() ) {
return !getArrayContains( object.getClass() ).contains( object,
workingMemory,
extractor1,
object1 );
} else {
throw new ClassCastException( "Can't check if an attribute is not member of an object of class " + object.getClass() );
}
}
public abstract String toString();
}
public static class BigDecimalMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BigDecimalMemberOfEvaluator();
public BigDecimalMemberOfEvaluator() {
super( ValueType.BIG_DECIMAL_TYPE,
MEMBEROF );
}
public String toString() {
return "BigDecimal memberOf";
}
}
public static class BigDecimalNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BigDecimalNotMemberOfEvaluator();
public BigDecimalNotMemberOfEvaluator() {
super( ValueType.BIG_DECIMAL_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "BigDecimal not memberOf";
}
}
public static class BigIntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BigIntegerMemberOfEvaluator();
public BigIntegerMemberOfEvaluator() {
super( ValueType.BIG_INTEGER_TYPE,
MEMBEROF );
}
public String toString() {
return "BigInteger memberOf";
}
}
public static class BigIntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
/**
*
*/
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BigIntegerNotMemberOfEvaluator();
public BigIntegerNotMemberOfEvaluator() {
super( ValueType.BIG_INTEGER_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "BigInteger not memberOf";
}
}
public static class BooleanMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BooleanMemberOfEvaluator();
public BooleanMemberOfEvaluator() {
super( ValueType.PBOOLEAN_TYPE,
MEMBEROF );
}
public String toString() {
return "Boolean memberOf";
}
}
public static class BooleanNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new BooleanNotMemberOfEvaluator();
public BooleanNotMemberOfEvaluator() {
super( ValueType.PBOOLEAN_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Boolean not memberOf";
}
}
public static class ByteMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ByteMemberOfEvaluator();
public ByteMemberOfEvaluator() {
super( ValueType.PBYTE_TYPE,
MEMBEROF );
}
public String toString() {
return "Byte memberOf";
}
}
public static class ByteNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ByteNotMemberOfEvaluator();
public ByteNotMemberOfEvaluator() {
super( ValueType.PBYTE_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Byte not memberOf";
}
}
public static class CharacterMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new CharacterMemberOfEvaluator();
public CharacterMemberOfEvaluator() {
super( ValueType.PCHAR_TYPE,
MEMBEROF );
}
public String toString() {
return "Character memberOf";
}
}
public static class CharacterNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new CharacterNotMemberOfEvaluator();
public CharacterNotMemberOfEvaluator() {
super( ValueType.PCHAR_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Character not memberOf";
}
}
public static class DateMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new DateMemberOfEvaluator();
public DateMemberOfEvaluator() {
super( ValueType.DATE_TYPE,
MEMBEROF );
}
public String toString() {
return "Date memberOf";
}
}
public static class DateNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new DateNotMemberOfEvaluator();
public DateNotMemberOfEvaluator() {
super( ValueType.DATE_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Date not memberOf";
}
}
public static class DoubleMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new DoubleMemberOfEvaluator();
public DoubleMemberOfEvaluator() {
super( ValueType.PDOUBLE_TYPE,
MEMBEROF );
}
public String toString() {
return "Double memberOf";
}
}
public static class DoubleNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new DoubleNotMemberOfEvaluator();
public DoubleNotMemberOfEvaluator() {
super( ValueType.PDOUBLE_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Double not memberOf";
}
}
public static class FloatMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new FloatMemberOfEvaluator();
public FloatMemberOfEvaluator() {
super( ValueType.PFLOAT_TYPE,
MEMBEROF );
}
public String toString() {
return "Float memberOf";
}
}
public static class FloatNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new FloatNotMemberOfEvaluator();
public FloatNotMemberOfEvaluator() {
super( ValueType.PFLOAT_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Float not memberOf";
}
}
public static class IntegerMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new IntegerMemberOfEvaluator();
public IntegerMemberOfEvaluator() {
super( ValueType.PINTEGER_TYPE,
MEMBEROF );
}
public String toString() {
return "Integer memberOf";
}
}
public static class IntegerNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new IntegerNotMemberOfEvaluator();
public IntegerNotMemberOfEvaluator() {
super( ValueType.PINTEGER_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Integer not memberOf";
}
}
public static class LongMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new LongMemberOfEvaluator();
public LongMemberOfEvaluator() {
super( ValueType.PLONG_TYPE,
MEMBEROF );
}
public String toString() {
return "Long memberOf";
}
}
public static class LongNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new LongNotMemberOfEvaluator();
public LongNotMemberOfEvaluator() {
super( ValueType.PLONG_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Long not memberOf";
}
}
public static class ObjectContainsEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ObjectContainsEvaluator();
public ObjectContainsEvaluator() {
super( ValueType.OBJECT_TYPE,
CONTAINS );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
final Object value = object2.getValue();
final Collection col = (Collection) extractor.getValue( workingMemory,
object1 );
return (col == null) ? false : col.contains( 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 : col.contains( 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 : col.contains( value );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object value = extractor2.getValue( workingMemory,
object2 );
final Collection col = (Collection) extractor1.getValue( workingMemory,
object1 );
return (col == null) ? false : col.contains( value );
}
public String toString() {
return "Object contains";
}
}
public static class ObjectExcludesEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ObjectExcludesEvaluator();
public ObjectExcludesEvaluator() {
super( ValueType.OBJECT_TYPE,
EXCLUDES );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1,
final FieldValue object2) {
final Object value = object2.getValue();
final Collection col = (Collection) extractor.getValue( workingMemory,
object1 );
return (col == null) ? true : !col.contains( 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 : !col.contains( 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 : !col.contains( value );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2,
final Object object2) {
final Object value = extractor2.getValue( workingMemory,
object2 );
final Collection col = (Collection) extractor1.getValue( workingMemory,
object1 );
return (col == null) ? true : !col.contains( value );
}
public String toString() {
return "Object excludes";
}
}
public static class ObjectMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ObjectMemberOfEvaluator();
public ObjectMemberOfEvaluator() {
super( ValueType.OBJECT_TYPE,
MEMBEROF );
}
public String toString() {
return "Object memberOf";
}
}
public static class ObjectNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ObjectNotMemberOfEvaluator();
public ObjectNotMemberOfEvaluator() {
super( ValueType.OBJECT_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Object not memberOf";
}
}
public static class ShortMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ShortMemberOfEvaluator();
public ShortMemberOfEvaluator() {
super( ValueType.PSHORT_TYPE,
MEMBEROF );
}
public String toString() {
return "Short memberOf";
}
}
public static class ShortNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new ShortNotMemberOfEvaluator();
public ShortNotMemberOfEvaluator() {
super( ValueType.PSHORT_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "Short not memberOf";
}
}
public static class StringMemberOfEvaluator extends BaseMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new StringMemberOfEvaluator();
public StringMemberOfEvaluator() {
super( ValueType.STRING_TYPE,
MEMBEROF );
}
public String toString() {
return "String memberOf";
}
}
public static class StringNotMemberOfEvaluator extends BaseNotMemberOfEvaluator {
private static final long serialVersionUID = 510l;
public final static Evaluator INSTANCE = new StringNotMemberOfEvaluator();
public StringNotMemberOfEvaluator() {
super( ValueType.STRING_TYPE,
NOT_MEMBEROF );
}
public String toString() {
return "String not memberOf";
}
}
public interface ArrayContains {
Class getArrayType();
boolean contains(Object array,
FieldValue value);
boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object);
//
// boolean member(FieldValue array,
// Object object);
//
// boolean member(Object object,
// InternalWorkingMemory workingMemory,
// InternalReadAccessor accessor,
// Object array);
}
public static class BooleanArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
boolean[] boolArray = (boolean[]) array;
for ( int i = 0, length = boolArray.length; i < length; i++ ) {
if ( boolArray[i] == value.getBooleanValue() ) {
return true;
}
}
return false;
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
boolean[] boolArray = (boolean[]) array;
for ( int i = 0, length = boolArray.length; i < length; i++ ) {
if ( boolArray[i] == accessor.getBooleanValue( workingMemory,
object ) ) {
return true;
}
}
return false;
}
private boolean contains(byte[] array,
byte value,
boolean negate) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return boolean[].class;
}
}
public static class ByteArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (byte[]) array,
value.getByteValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (byte[]) array,
accessor.getByteValue( workingMemory,
object ) );
}
private boolean contains(byte[] array,
byte value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return byte[].class;
}
}
public static class ShortArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (short[]) array,
value.getShortValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (short[]) array,
accessor.getShortValue( workingMemory,
object ) );
}
private boolean contains(short[] array,
short value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return short[].class;
}
}
public static class CharArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (char[]) array,
value.getCharValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (char[]) array,
accessor.getCharValue( workingMemory,
object ) );
}
private boolean contains(char[] array,
char value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return char[].class;
}
}
public static class IntegerArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (int[]) array,
value.getIntValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (int[]) array,
accessor.getIntValue( workingMemory,
object ) );
}
private boolean contains(int[] array,
int value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return int[].class;
}
}
public static class LongArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (long[]) array,
value.getLongValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (long[]) array,
accessor.getLongValue( workingMemory,
object ) );
}
private boolean contains(long[] array,
long value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return long[].class;
}
}
public static class FloatArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue value) {
return contains( (float[]) array,
value.getFloatValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (float[]) array,
accessor.getFloatValue( workingMemory,
object ) );
}
private boolean contains(float[] array,
float value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return float[].class;
}
}
public static class DoubleArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue fieldValue) {
return contains( (double[]) array,
fieldValue.getDoubleValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (double[]) array,
accessor.getDoubleValue( workingMemory,
object ) );
}
// public boolean member(FieldValue array,
// Object object) {
// return contains( (double[]) array.getValue(),
// object );
// }
//
// public boolean member(Object object,
// InternalWorkingMemory workingMemory,
// InternalReadAccessor accessor,
// Object array) {
// return contains( (double[]) accessor.getValue( workingMemory,
// object ),
// object );
// }
private boolean contains(double[] array,
double value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i] == value ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return double[].class;
}
}
public static class ObjectArrayContainsEvaluator
implements
ArrayContains {
public boolean contains(Object array,
FieldValue fieldValue) {
return contains( (Object[]) array,
fieldValue.getValue() );
}
public boolean contains(Object array,
InternalWorkingMemory workingMemory,
InternalReadAccessor accessor,
Object object) {
return contains( (Object[]) array,
accessor.getValue( workingMemory,
object ) );
}
private boolean contains(Object[] array,
Object value) {
for ( int i = 0, length = array.length; i < length; i++ ) {
if ( array[i].equals( value ) ) {
return true;
}
}
return false;
}
public Class getArrayType() {
return Object[].class;
}
// public boolean member(FieldValue array,
// Object object) {
// return contains( (Object[]) array.getValue(),
// object );
// }
//
// public boolean member(Object object,
// InternalWorkingMemory workingMemory,
// InternalReadAccessor accessor,
// Object array) {
// return contains( (Object[]) accessor.getValue( workingMemory,
// object ),
// object );
// }
}
}