internal override ExpressionNode Optimize()
{
left = left.Optimize();
if (op == Operators.Is)
{
// only 'Is Null' or 'Is Not Null' are valid
if (right is UnaryNode)
{
UnaryNode un = (UnaryNode)right;
if (un.op != Operators.Not)
{
throw ExprException.InvalidIsSyntax();
}
op = Operators.IsNot;
right = un.right;
}
if (right is ZeroOpNode)
{
if (((ZeroOpNode)right).op != Operators.Null)
{
throw ExprException.InvalidIsSyntax();
}
}
else
{
throw ExprException.InvalidIsSyntax();
}
}
else
{
right = right.Optimize();
}
#if DEBUG
if (CompModSwitches.BinaryNode.TraceVerbose)
{
Debug.WriteLine("Optimizing " + this.ToString());
}
#endif
if (this.IsConstant())
{
object val = this.Eval();
#if DEBUG
if (CompModSwitches.BinaryNode.TraceVerbose)
{
Debug.WriteLine("the node value is " + val.ToString());
}
#endif
if (val == DBNull.Value)
{
return(new ZeroOpNode(Operators.Null));
}
if (val is bool)
{
if ((bool)val)
{
return(new ZeroOpNode(Operators.True));
}
else
{
return(new ZeroOpNode(Operators.False));
}
}
#if DEBUG
if (CompModSwitches.BinaryNode.TraceVerbose)
{
Debug.WriteLine(val.GetType().ToString());
}
#endif
return(new ConstNode(ValueType.Object, val, false));
}
else
{
return(this);
}
}