001    
002    package railo.runtime.sql.old;
003    
004    import java.util.Vector;
005    
006    // Referenced classes of package Zql:
007    //            ZExp, ZQuery, ZConstant, ZUtils
008    
009    public final class ZExpression
010        implements ZExp
011    {
012    
013        public ZExpression(String s)
014        {
015            op_ = null;
016            operands_ = null;
017            op_ = new String(s);
018        }
019    
020        public ZExpression(String s, ZExp zexp)
021        {
022            op_ = null;
023            operands_ = null;
024            op_ = new String(s);
025            addOperand(zexp);
026        }
027    
028        public ZExpression(String s, ZExp zexp, ZExp zexp1)
029        {
030            op_ = null;
031            operands_ = null;
032            op_ = new String(s);
033            addOperand(zexp);
034            addOperand(zexp1);
035        }
036    
037        public String getOperator()
038        {
039            return op_;
040        }
041    
042        public void setOperands(Vector vector)
043        {
044            operands_ = vector;
045        }
046    
047        public Vector getOperands()
048        {
049            return operands_;
050        }
051    
052        public void addOperand(ZExp zexp)
053        {
054            if(operands_ == null)
055                operands_ = new Vector();
056            operands_.addElement(zexp);
057        }
058    
059        public ZExp getOperand(int i)
060        {
061            if(operands_ == null || i >= operands_.size())
062                return null;
063            return (ZExp)operands_.elementAt(i);
064        }
065    
066        public int nbOperands()
067        {
068            if(operands_ == null)
069                return 0;
070            return operands_.size();
071        }
072    
073        public String toReversePolish()
074        {
075            StringBuffer stringbuffer = new StringBuffer("(");
076            stringbuffer.append(op_);
077            for(int i = 0; i < nbOperands(); i++)
078            {
079                ZExp zexp = getOperand(i);
080                if(zexp instanceof ZExpression)
081                    stringbuffer.append(" " + ((ZExpression)zexp).toReversePolish());
082                else
083                if(zexp instanceof ZQuery)
084                    stringbuffer.append(" (" + zexp.toString() + ")");
085                else
086                    stringbuffer.append(" " + zexp.toString());
087            }
088    
089            stringbuffer.append(")");
090            return stringbuffer.toString();
091        }
092    
093        public String toString()
094        {
095            if(op_.equals("?"))
096                return op_;
097            if(ZUtils.isCustomFunction(op_) > 0)
098                return formatFunction();
099            StringBuffer stringbuffer = new StringBuffer();
100            if(needPar(op_))
101                stringbuffer.append("(");
102            switch(nbOperands())
103            {
104            case 1: // '\001'
105                ZExp zexp = getOperand(0);
106                if(zexp instanceof ZConstant)
107                {
108                    if(ZUtils.isAggregate(op_))
109                        stringbuffer.append(op_ + "(" + zexp.toString() + ")");
110                    else
111                        stringbuffer.append(op_ + " " + zexp.toString());
112                } else
113                if(zexp instanceof ZQuery)
114                    stringbuffer.append(op_ + " (" + zexp.toString() + ")");
115                else
116                    stringbuffer.append(op_ + " " + zexp.toString());
117                break;
118    
119            case 3: // '\003'
120                if(op_.toUpperCase().endsWith("BETWEEN"))
121                {
122                    stringbuffer.append(getOperand(0).toString() + " " + op_ + " " + getOperand(1).toString() + " AND " + getOperand(2).toString());
123                    break;
124                }
125                // fall through
126    
127            default:
128                boolean flag = op_.equals("IN") || op_.equals("NOT IN");
129                int i = nbOperands();
130                for(int j = 0; j < i; j++)
131                {
132                    if(flag && j == 1)
133                        stringbuffer.append(" " + op_ + " (");
134                    ZExp zexp1 = getOperand(j);
135                    if((zexp1 instanceof ZQuery) && !flag)
136                        stringbuffer.append("(" + zexp1.toString() + ")");
137                    else
138                        stringbuffer.append(zexp1.toString());
139                    if(j < i - 1)
140                        if(op_.equals(",") || flag && j > 0)
141                            stringbuffer.append(", ");
142                        else
143                        if(!flag)
144                            stringbuffer.append(" " + op_ + " ");
145                }
146    
147                if(flag)
148                    stringbuffer.append(")");
149                break;
150            }
151            if(needPar(op_))
152                stringbuffer.append(")");
153            return stringbuffer.toString();
154        }
155    
156        private boolean needPar(String s)
157        {
158            s = s.toUpperCase();
159            return !s.equals("ANY") && !s.equals("ALL") && !s.equals("UNION") && !ZUtils.isAggregate(s);
160        }
161    
162        private String formatFunction()
163        {
164            StringBuffer stringbuffer = new StringBuffer(op_ + "(");
165            int i = nbOperands();
166            for(int j = 0; j < i; j++)
167                stringbuffer.append(getOperand(j).toString() + (j >= i - 1 ? "" : ","));
168    
169            stringbuffer.append(")");
170            return stringbuffer.toString();
171        }
172    
173        String op_;
174        Vector operands_;
175    }