Primitive opType = (Primitive)op.getType();
if (firstType.findEQFunction(opType) == null)
{
throw new TypeMismatchException(getSymbol());
}
op.setValue(firstType.getConverter(opType).invoke(op.getValue()));
op.setType(firstType);
if (op.getValue() == null && !first.isConstant())
{
bNull = true;
removeOperand(i--);
}
}
if (first.isConstant())
{
setConstantValue(evaluate());
}
else
{
if (first.getOrdinal() == AttributeOperator.ORDINAL)
{
AttributeOperator aop = (AttributeOperator)first;
Converter converter = aop.getConverter();
if (converter != null)
{
aop.setType(converter.getSourceType());
aop.setNoConversion(true);
for (int i = 1; i < m_nOperandCount; ++i)
{
Operator op = m_operandArray[i];
op.setValue(converter.getInverseFunction().invoke(op.getValue()));
op.setType(converter.getSourceType());
}
}
}
if (bNull)
{
if (m_nOperandCount > 1)
{
OrOperator or = new OrOperator();
or.setParent(m_parent);
EqualsOperator eq = new EqualsOperator();
eq.setParent(or);
eq.setLeft((Operator)first.clone());
eq.setRight(new ConstantOperator(null));
or.addOperand(eq.normalize(nFlags | NORMALIZE_NORECUR));
or.addOperand(this);
return or.normalize(nFlags | NORMALIZE_NORECUR);
}
else
{
EqualsOperator eq = new EqualsOperator();
eq.setParent(m_parent);
eq.setLeft(first);
eq.setRight(new ConstantOperator(null));
eq.normalize(nFlags | NORMALIZE_NORECUR);
return eq;
}
}
}
}
else
{
assert first.getOrdinal() == AttributeOperator.ORDINAL;
for (int i = 1; i < m_nOperandCount; ++i)
{
Operator op = m_operandArray[i];
if (op.getType() != null)
{
if (op.getType().isPrimitive() &&
(op.getType() != Primitive.ANY || !op.isConstant() ||
op.getValue() != null && !(op.getValue() instanceof OIDHolder)))
{
throw new TypeMismatchException(getSymbol());
}
}
}
if (first.isConstant())
{
foldObjectIn(first);
return this;
}
if ((nFlags & NORMALIZE_PERSISTENCE) != 0 && m_source != null)
{
PersistenceAdapter adapter = m_source.getAdapter();
Field[] fieldArray = adapter.getFields(m_source);
if (fieldArray != null)
{
int nCount = fieldArray.length;
assert nCount > 0;
if (nCount == 1)
{
Field field = fieldArray[0];
first.setSource(field);
first.setType(field.getType());
for (int i = 1; i < m_nOperandCount; ++i)
{
Operator op = m_operandArray[i];
if (op.getValue() == null)
{
op.setType(null);
}
else
{
OID oid = ((OIDHolder)op.getValue()).getOID();
if (oid != null)
{
Object[] valueArray = adapter.getValues(oid, m_source);
if (valueArray.length != 1)
{
throw new TypeMismatchException(getSymbol());
}
op.setValue(valueArray[0]);
op.setType(Primitive.primitiveOf(op.getValue()));
}
else
{
removeOperand(i--);
}
}
}
return normalize(nFlags | NORMALIZE_NORECUR);
}
else
{
OrOperator or = new OrOperator();
for (int i = 1; i < m_nOperandCount; ++i)
{
Operator op = m_operandArray[i];
Object[] valueArray = null;
if (op.getValue() != null)
{
OID oid = ((OIDHolder)op.getValue()).getOID();
if (oid != null)
{
valueArray = adapter.getValues(oid, m_source);
if (valueArray.length != nCount)
{
throw new TypeMismatchException(getSymbol());
}
}
else
{
continue;