/**
* 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.Date;
import java.math.BigDecimal;
import org.drools.base.BaseEvaluator;
import org.drools.base.ValueType;
import org.drools.common.InternalWorkingMemory;
import org.drools.core.util.DateUtils;
import org.drools.core.util.MathUtils;
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.FieldValue;
import org.drools.spi.InternalReadAccessor;
/**
* 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 = 510l;
{
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 );
}
};
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 false;
}
public Target getTarget() {
return Target.FACT;
}
public boolean supportsType(ValueType type) {
return this.evaluators.supportsType( type );
}
/* *********************************************************
* Evaluator Implementations
* *********************************************************
*/
public static class ArrayEqualEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new ArrayEqualEvaluator();
public ArrayEqualEvaluator() {
super( ValueType.ARRAY_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class ArrayNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new ArrayNotEqualEvaluator();
public ArrayNotEqualEvaluator() {
super( ValueType.ARRAY_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class BigDecimalEqualEvaluator extends BaseEvaluator {
/**
*
*/
static boolean isEqual(Object value1, Object value2) {
if (!(value1 instanceof BigDecimal ) || !(value2 instanceof BigDecimal)) return false;
return ((BigDecimal)value1).compareTo((BigDecimal) value2) == 0;
}
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new BigDecimalEqualEvaluator();
public BigDecimalEqualEvaluator() {
super( ValueType.BIG_DECIMAL_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1, final FieldValue object2) {
final Object value1 = extractor.getBigDecimalValue( workingMemory, object1 );
final BigDecimal value2 = object2.getBigDecimalValue();
if ( value1 == null ) {
return value2 == null;
}
return isEqual(value1, value2);
}
public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object left) {
final Object value = context.declaration.getExtractor().getBigDecimalValue( workingMemory, left );
if ( value == null ) {
return ((ObjectVariableContextEntry) context).right == null;
}
return isEqual(value, MathUtils.getBigDecimal( ((ObjectVariableContextEntry) context).right ));
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getBigDecimalValue( workingMemory, right );
if ( ((ObjectVariableContextEntry) context).left == null ) {
return value == null;
}
return isEqual(MathUtils.getBigDecimal( ((ObjectVariableContextEntry) context).left ), value);
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2, final Object object2) {
final Object value1 = extractor1.getBigDecimalValue( workingMemory, object1 );
final Object value2 = extractor2.getBigDecimalValue( workingMemory, object2 );
if ( value1 == null ) {
return value2 == null;
}
return isEqual(value1, value2);
}
public String toString() {
return "BigDecimal ==";
}
}
public static class BigDecimalNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new BigDecimalNotEqualEvaluator();
public BigDecimalNotEqualEvaluator() {
super( ValueType.BIG_DECIMAL_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1, final FieldValue object2) {
final Object value1 = extractor.getBigDecimalValue( workingMemory, object1 );
final Object value2 = object2.getBigDecimalValue();
if ( value1 == null ) {
return value2 != null;
}
return !BigDecimalEqualEvaluator.isEqual(value1, value2 );
}
public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object left) {
final Object value = context.declaration.getExtractor().getBigDecimalValue( workingMemory, left );
if ( value == null ) {
return ((ObjectVariableContextEntry) context).right != null;
}
return !BigDecimalEqualEvaluator.isEqual(value, MathUtils.getBigDecimal( ((ObjectVariableContextEntry) context).right ));
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getBigDecimalValue( workingMemory, right );
if ( ((ObjectVariableContextEntry) context).left == null ) {
return value != null;
}
return !BigDecimalEqualEvaluator.isEqual(MathUtils.getBigDecimal( ((ObjectVariableContextEntry) context).left ), value );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2, final Object object2) {
final Object value1 = extractor1.getBigDecimalValue( workingMemory, object1 );
final Object value2 = extractor2.getBigDecimalValue( workingMemory, object2 );
if ( value1 == null ) {
return value2 != null;
}
return !BigDecimalEqualEvaluator.isEqual(value1, value2 );
}
public String toString() {
return "BigDecimal !=";
}
}
public static class BigIntegerEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new BigIntegerEqualEvaluator();
public BigIntegerEqualEvaluator() {
super( ValueType.BIG_INTEGER_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1, final FieldValue object2) {
final Object value1 = extractor.getBigIntegerValue( workingMemory, object1 );
final Object value2 = object2.getBigIntegerValue();
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().getBigIntegerValue( workingMemory, left );
if ( value == null ) {
return ((ObjectVariableContextEntry) context).right == null;
}
return value.equals( MathUtils.getBigInteger( ((ObjectVariableContextEntry) context).right ) );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getBigIntegerValue( workingMemory, right );
if ( ((ObjectVariableContextEntry) context).left == null ) {
return value == null;
}
return MathUtils.getBigInteger( ((ObjectVariableContextEntry) context).left ).equals( value );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2, final Object object2) {
final Object value1 = extractor1.getBigIntegerValue( workingMemory, object1 );
final Object value2 = extractor2.getBigIntegerValue( workingMemory, object2 );
if ( value1 == null ) {
return value2 == null;
}
return value1.equals( value2 );
}
public String toString() {
return "BigInteger ==";
}
}
public static class BigIntegerNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new BigIntegerNotEqualEvaluator();
public BigIntegerNotEqualEvaluator() {
super( ValueType.BIG_INTEGER_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor,
final Object object1, final FieldValue object2) {
final Object value1 = extractor.getBigIntegerValue( workingMemory, object1 );
final Object value2 = object2.getBigIntegerValue();
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().getBigIntegerValue( workingMemory, left );
if ( value == null ) {
return ((ObjectVariableContextEntry) context).right != null;
}
return !value.equals(MathUtils.getBigInteger( ((ObjectVariableContextEntry) context).right ));
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getBigIntegerValue( workingMemory, right );
if ( ((ObjectVariableContextEntry) context).left == null ) {
return value != null;
}
return !MathUtils.getBigInteger( ((ObjectVariableContextEntry) context).left).equals( value );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor extractor2, final Object object2) {
final Object value1 = extractor1.getBigIntegerValue( workingMemory, object1 );
final Object value2 = extractor2.getBigIntegerValue( workingMemory, object2 );
if ( value1 == null ) {
return value2 != null;
}
return !value1.equals( value2 );
}
public String toString() {
return "BigInteger !=";
}
}
public static class BooleanEqualEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 400L;
private final static Evaluator INSTANCE = new BooleanEqualEvaluator();
public BooleanEqualEvaluator() {
super( ValueType.PBOOLEAN_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class BooleanNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new BooleanNotEqualEvaluator();
public BooleanNotEqualEvaluator() {
super( ValueType.PBOOLEAN_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class ByteEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new ByteEqualEvaluator();
public ByteEqualEvaluator() {
super( ValueType.PBYTE_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class ByteNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new ByteNotEqualEvaluator();
public ByteNotEqualEvaluator() {
super( ValueType.PBYTE_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class CharacterEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new CharacterEqualEvaluator();
public CharacterEqualEvaluator() {
super( ValueType.PCHAR_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class CharacterNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new CharacterNotEqualEvaluator();
public CharacterNotEqualEvaluator() {
super( ValueType.PCHAR_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class DateEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new DateEqualEvaluator();
public DateEqualEvaluator() {
super( ValueType.DATE_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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, workingMemory.getDateFormats() ) ) == 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, workingMemory.getDateFormats() ) ) == 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, workingMemory.getDateFormats() ) ) == 0;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class DateNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new DateNotEqualEvaluator();
public DateNotEqualEvaluator() {
super( ValueType.DATE_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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, workingMemory.getDateFormats() ) ) != 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, workingMemory.getDateFormats() ) ) != 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, workingMemory.getDateFormats() ) ) != 0;
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class DoubleEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new DoubleEqualEvaluator();
public DoubleEqualEvaluator() {
super( ValueType.PDOUBLE_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class DoubleNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new DoubleNotEqualEvaluator();
public DoubleNotEqualEvaluator() {
super( ValueType.PDOUBLE_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class FactTemplateEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new FactTemplateEqualEvaluator();
public FactTemplateEqualEvaluator() {
super( ValueType.FACTTEMPLATE_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class FactTemplateNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new FactTemplateNotEqualEvaluator();
public FactTemplateNotEqualEvaluator() {
super( ValueType.FACTTEMPLATE_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class FloatEqualEvaluator extends BaseEvaluator {
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new FloatEqualEvaluator();
public FloatEqualEvaluator() {
super( ValueType.PFLOAT_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class FloatNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new FloatNotEqualEvaluator();
public FloatNotEqualEvaluator() {
super( ValueType.PFLOAT_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 public class IntegerEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new IntegerEqualEvaluator();
public IntegerEqualEvaluator() {
super( ValueType.PINTEGER_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class IntegerNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new IntegerNotEqualEvaluator();
public IntegerNotEqualEvaluator() {
super( ValueType.PINTEGER_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class LongEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new LongEqualEvaluator();
public LongEqualEvaluator() {
super( ValueType.PLONG_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class LongNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new LongNotEqualEvaluator();
public LongNotEqualEvaluator() {
super( ValueType.PLONG_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public 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();
public ObjectEqualEvaluator() {
super( ValueType.OBJECT_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 value = context.declaration.getExtractor().getValue( workingMemory, left );
return comparator.equals( ((ObjectVariableContextEntry) context).right, value );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getValue( workingMemory, right );
return comparator.equals( value, ((ObjectVariableContextEntry) context).left );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public 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();
public ObjectNotEqualEvaluator() {
super( ValueType.OBJECT_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 value = context.declaration.getExtractor().getValue( workingMemory, left );
return !comparator.equals( ((ObjectVariableContextEntry) context).right, value );
}
public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
final VariableContextEntry context, final Object right) {
final Object value = context.extractor.getValue( workingMemory, right );
return !comparator.equals( value, ((ObjectVariableContextEntry) context).left );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 !=";
}
}
public static class ShortEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
private static final Evaluator INSTANCE = new ShortEqualEvaluator();
public ShortEqualEvaluator() {
super( ValueType.PSHORT_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class ShortNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
private static final Evaluator INSTANCE = new ShortNotEqualEvaluator();
public ShortNotEqualEvaluator() {
super( ValueType.PSHORT_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 public class StringEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new StringEqualEvaluator();
public StringEqualEvaluator() {
super( ValueType.STRING_TYPE,
Operator.EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 ==";
}
}
public static class StringNotEqualEvaluator extends BaseEvaluator {
/**
*
*/
private static final long serialVersionUID = 400L;
public final static Evaluator INSTANCE = new StringNotEqualEvaluator();
public StringNotEqualEvaluator() {
super( ValueType.STRING_TYPE,
Operator.NOT_EQUAL );
}
public boolean evaluate(InternalWorkingMemory workingMemory,
final InternalReadAccessor 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 InternalReadAccessor extractor1,
final Object object1,
final InternalReadAccessor 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 || arg1 == null ) {
return arg0 == arg1;
}
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 ) {
try {
val1 = Double.parseDouble( ( String ) arg1 );
} catch( Exception ex ) {
// parsing failed, so not a number
return false;
}
} else {
// if it is not a number, it is not equals
return false;
}
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 );
}
}
}