KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tonbeller > wcf > param > SqlGenerator


1 package com.tonbeller.wcf.param;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.HashMap JavaDoc;
5 import java.util.Iterator JavaDoc;
6 import java.util.List JavaDoc;
7 import java.util.Map JavaDoc;
8
9 import com.tonbeller.wcf.utils.SqlUtils;
10
11 /**
12  * @author av
13  * @since 31.01.2005
14  */

15 public class SqlGenerator implements SqlExprVisitor {
16   StringBuffer JavaDoc sb;
17   Map JavaDoc columnMap;
18
19   /**
20    * if no columnId is set in an SqlExpr use this string to look up the column name
21    */

22   public static final String JavaDoc DEFAULT_COLUMN_ID = "DEFAULT_COLUMN_ID";
23
24   public SqlGenerator() {
25     this.columnMap = new HashMap JavaDoc();
26   }
27
28   /**
29    * @param defaultColumn the name of the generated column if no column id is present in the SqlExpr
30    */

31   public SqlGenerator(String JavaDoc defaultColumn) {
32     this.columnMap = new HashMap JavaDoc();
33     columnMap.put(DEFAULT_COLUMN_ID, defaultColumn);
34   }
35
36   public SqlGenerator(Map JavaDoc columnMap) {
37     this.columnMap = columnMap;
38   }
39
40   /**
41    * returns a new SqlGenerator that shares the same settings as this.
42    */

43   protected SqlGenerator copyGenerator() {
44     return new SqlGenerator(columnMap);
45   }
46
47   /**
48    * generates SQL for opd in a new SqlGenerator
49    */

50   protected String JavaDoc generateOpd(SqlExpr opd) {
51     return copyGenerator().generate(opd);
52   }
53
54   protected String JavaDoc getColumnName(SqlColumnConstraint scc) {
55     String JavaDoc columnId = scc.getColumnId();
56     if (columnId == null)
57       columnId = DEFAULT_COLUMN_ID;
58     String JavaDoc qname = (String JavaDoc) columnMap.get(columnId);
59     if (qname != null)
60       return qname;
61     return columnId;
62   }
63
64   public void genAndOr(SqlExprWithOperands exp, String JavaDoc keyword) {
65     Iterator JavaDoc it = exp.getOperands().iterator();
66     SqlExpr opd = (SqlExpr) it.next();
67     sb.append("(");
68     sb.append(generateOpd(opd));
69     while (it.hasNext()) {
70       sb.append(" ");
71       sb.append(keyword);
72       sb.append(" ");
73       opd = (SqlExpr) it.next();
74       sb.append(generateOpd(opd));
75     }
76     sb.append(")");
77   }
78
79   public void visitSqlAndExpr(SqlAndExpr exp) {
80     genAndOr(exp, "AND");
81   }
82
83   public void visitSqlOrExpr(SqlOrExpr exp) {
84     genAndOr(exp, "OR");
85   }
86
87   public void visitSqlBetweenExpr(SqlBetweenExpr exp) {
88     sb.append(getColumnName(exp));
89     sb.append(" BETWEEN ");
90     sb.append(SqlUtils.escapeSql(exp.getFirst()));
91     sb.append(" AND ");
92     sb.append(SqlUtils.escapeSql(exp.getLast()));
93   }
94
95   public void visitSqlEqualExpr(SqlEqualExpr exp) {
96     generateEquals(exp, exp.getSqlValue());
97   }
98
99   private void generateEquals(SqlColumnConstraint exp, Object JavaDoc sqlValue) {
100     sb.append(getColumnName(exp));
101     if (sqlValue == null)
102       sb.append(" IS NULL");
103     else {
104       sb.append(" = ");
105       sb.append(SqlUtils.escapeSql(sqlValue));
106     }
107   }
108
109   public void visitSqlDummyExpr(SqlDummyExpr exp) {
110     sb.append("1 = 1");
111   }
112
113   public void visitSqlInExpr(SqlInExpr exp) {
114     Object JavaDoc[] values = exp.getSqlValues();
115
116     String JavaDoc cname = getColumnName(exp);
117     boolean containsNull = containsNull(values);
118     if (containsNull)
119       values = removeNulls(values);
120
121     if (values.length == 0) {
122       // empty list
123
if (containsNull)
124         sb.append(cname).append(" IS NULL");
125       else
126         sb.append("1=0");
127     } else if (values.length == 1) {
128       // one single element
129
if (containsNull) {
130         sb.append("(");
131         sb.append(cname);
132         sb.append(" = ");
133         sb.append(SqlUtils.escapeSql(values[0]));
134         sb.append(" OR ");
135         sb.append(cname);
136         sb.append(" IS NULL)");
137       } else {
138         sb.append(cname);
139         sb.append(" = ");
140         sb.append(SqlUtils.escapeSql(values[0]));
141       }
142     } else {
143       // multiple elements
144
String JavaDoc list = generateList(values);
145       if (containsNull) {
146         sb.append("(");
147         sb.append(cname);
148         sb.append(" IN (");
149         sb.append(list);
150         sb.append(") OR ");
151         sb.append(cname);
152         sb.append(" IS NULL)");
153       } else {
154         sb.append(cname);
155         sb.append(" IN (");
156         sb.append(list);
157         sb.append(")");
158       }
159     }
160   }
161
162   protected String JavaDoc generateList(Object JavaDoc[] values) {
163     StringBuffer JavaDoc list = new StringBuffer JavaDoc();
164     for (int i = 0; i < values.length; i++) {
165       if (i > 0)
166         list.append(", ");
167       list.append(SqlUtils.escapeSql(values[i]));
168     }
169     return list.toString();
170   }
171
172   protected Object JavaDoc[] removeNulls(Object JavaDoc[] values) {
173     List JavaDoc list = new ArrayList JavaDoc();
174     for (int i = 0; i < values.length; i++) {
175       if (values[i] != null)
176         list.add(values[i]);
177     }
178     return list.toArray();
179   }
180
181   protected boolean containsNull(Object JavaDoc[] values) {
182     for (int i = 0; i < values.length; i++)
183       if (values[i] == null)
184         return true;
185     return false;
186   }
187
188   /**
189    * generates SQL string from expression
190    */

191   public String JavaDoc generate(SqlExpr sqlExpr) {
192     sb = new StringBuffer JavaDoc();
193     sqlExpr.accept(this);
194     return sb.toString();
195   }
196
197   /**
198    * maps columnIds to column names. Example: "CUSTOMER" -> "CUSTOMER_TABLE.CUSTOMER_FK"
199    */

200   public Map JavaDoc getColumnMap() {
201     return columnMap;
202   }
203
204   /**
205    * maps columnIds to column names. Example: "CUSTOMER" -> "CUSTOMER_TABLE.CUSTOMER_FK"
206    */

207   public void setColumnMap(Map JavaDoc columnMap) {
208     this.columnMap = columnMap;
209   }
210
211 }
Popular Tags