package railo.runtime.sql.old;
import java.util.Vector;
// Referenced classes of package Zql:
// ZExp, ZQuery, ZConstant, ZUtils
public final class ZExpression
implements ZExp
{
public ZExpression(String s)
{
op_ = null;
operands_ = null;
op_ = new String(s);
}
public ZExpression(String s, ZExp zexp)
{
op_ = null;
operands_ = null;
op_ = new String(s);
addOperand(zexp);
}
public ZExpression(String s, ZExp zexp, ZExp zexp1)
{
op_ = null;
operands_ = null;
op_ = new String(s);
addOperand(zexp);
addOperand(zexp1);
}
public String getOperator()
{
return op_;
}
public void setOperands(Vector vector)
{
operands_ = vector;
}
public Vector getOperands()
{
return operands_;
}
public void addOperand(ZExp zexp)
{
if(operands_ == null)
operands_ = new Vector();
operands_.addElement(zexp);
}
public ZExp getOperand(int i)
{
if(operands_ == null || i >= operands_.size())
return null;
return (ZExp)operands_.elementAt(i);
}
public int nbOperands()
{
if(operands_ == null)
return 0;
return operands_.size();
}
public String toReversePolish()
{
StringBuffer stringbuffer = new StringBuffer("(");
stringbuffer.append(op_);
for(int i = 0; i < nbOperands(); i++)
{
ZExp zexp = getOperand(i);
if(zexp instanceof ZExpression)
stringbuffer.append(" " + ((ZExpression)zexp).toReversePolish());
else
if(zexp instanceof ZQuery)
stringbuffer.append(" (" + zexp.toString() + ")");
else
stringbuffer.append(" " + zexp.toString());
}
stringbuffer.append(")");
return stringbuffer.toString();
}
public String toString()
{
if(op_.equals("?"))
return op_;
if(ZUtils.isCustomFunction(op_) > 0)
return formatFunction();
StringBuffer stringbuffer = new StringBuffer();
if(needPar(op_))
stringbuffer.append("(");
switch(nbOperands())
{
case 1: // '\001'
ZExp zexp = getOperand(0);
if(zexp instanceof ZConstant)
{
if(ZUtils.isAggregate(op_))
stringbuffer.append(op_ + "(" + zexp.toString() + ")");
else
stringbuffer.append(op_ + " " + zexp.toString());
} else
if(zexp instanceof ZQuery)
stringbuffer.append(op_ + " (" + zexp.toString() + ")");
else
stringbuffer.append(op_ + " " + zexp.toString());
break;
case 3: // '\003'
if(op_.toUpperCase().endsWith("BETWEEN"))
{
stringbuffer.append(getOperand(0).toString() + " " + op_ + " " + getOperand(1).toString() + " AND " + getOperand(2).toString());
break;
}
// fall through
default:
boolean flag = op_.equals("IN") || op_.equals("NOT IN");
int i = nbOperands();
for(int j = 0; j < i; j++)
{
if(flag && j == 1)
stringbuffer.append(" " + op_ + " (");
ZExp zexp1 = getOperand(j);
if((zexp1 instanceof ZQuery) && !flag)
stringbuffer.append("(" + zexp1.toString() + ")");
else
stringbuffer.append(zexp1.toString());
if(j < i - 1)
if(op_.equals(",") || flag && j > 0)
stringbuffer.append(", ");
else
if(!flag)
stringbuffer.append(" " + op_ + " ");
}
if(flag)
stringbuffer.append(")");
break;
}
if(needPar(op_))
stringbuffer.append(")");
return stringbuffer.toString();
}
private boolean needPar(String s)
{
s = s.toUpperCase();
return !s.equals("ANY") && !s.equals("ALL") && !s.equals("UNION") && !ZUtils.isAggregate(s);
}
private String formatFunction()
{
StringBuffer stringbuffer = new StringBuffer(op_ + "(");
int i = nbOperands();
for(int j = 0; j < i; j++)
stringbuffer.append(getOperand(j).toString() + (j >= i - 1 ? "" : ","));
stringbuffer.append(")");
return stringbuffer.toString();
}
String op_;
Vector operands_;
}