1 package com.tonbeller.wcf.param; 2 3 import java.util.ArrayList ; 4 import java.util.HashMap ; 5 import java.util.Iterator ; 6 import java.util.List ; 7 import java.util.Map ; 8 9 import com.tonbeller.wcf.utils.SqlUtils; 10 11 15 public class SqlGenerator implements SqlExprVisitor { 16 StringBuffer sb; 17 Map columnMap; 18 19 22 public static final String DEFAULT_COLUMN_ID = "DEFAULT_COLUMN_ID"; 23 24 public SqlGenerator() { 25 this.columnMap = new HashMap (); 26 } 27 28 31 public SqlGenerator(String defaultColumn) { 32 this.columnMap = new HashMap (); 33 columnMap.put(DEFAULT_COLUMN_ID, defaultColumn); 34 } 35 36 public SqlGenerator(Map columnMap) { 37 this.columnMap = columnMap; 38 } 39 40 43 protected SqlGenerator copyGenerator() { 44 return new SqlGenerator(columnMap); 45 } 46 47 50 protected String generateOpd(SqlExpr opd) { 51 return copyGenerator().generate(opd); 52 } 53 54 protected String getColumnName(SqlColumnConstraint scc) { 55 String columnId = scc.getColumnId(); 56 if (columnId == null) 57 columnId = DEFAULT_COLUMN_ID; 58 String qname = (String ) columnMap.get(columnId); 59 if (qname != null) 60 return qname; 61 return columnId; 62 } 63 64 public void genAndOr(SqlExprWithOperands exp, String keyword) { 65 Iterator 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 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 [] values = exp.getSqlValues(); 115 116 String cname = getColumnName(exp); 117 boolean containsNull = containsNull(values); 118 if (containsNull) 119 values = removeNulls(values); 120 121 if (values.length == 0) { 122 if (containsNull) 124 sb.append(cname).append(" IS NULL"); 125 else 126 sb.append("1=0"); 127 } else if (values.length == 1) { 128 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 String 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 generateList(Object [] values) { 163 StringBuffer list = new StringBuffer (); 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 [] removeNulls(Object [] values) { 173 List list = new ArrayList (); 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 [] values) { 182 for (int i = 0; i < values.length; i++) 183 if (values[i] == null) 184 return true; 185 return false; 186 } 187 188 191 public String generate(SqlExpr sqlExpr) { 192 sb = new StringBuffer (); 193 sqlExpr.accept(this); 194 return sb.toString(); 195 } 196 197 200 public Map getColumnMap() { 201 return columnMap; 202 } 203 204 207 public void setColumnMap(Map columnMap) { 208 this.columnMap = columnMap; 209 } 210 211 } | Popular Tags |