1 package jimm.datavision.source; 2 import jimm.datavision.*; 3 import jimm.datavision.field.*; 4 import jimm.util.XMLWriter; 5 import java.util.*; 6 7 12 public class Query implements Writeable { 13 14 public static final int SORT_UNDEFINED = -1; 15 public static final int SORT_DESCENDING = 0; 16 public static final int SORT_ASCENDING = 1; 17 18 protected Report report; 19 protected ArrayList joins; 20 protected String whereClause; 21 protected ArrayList sortSelectables; 22 protected ArrayList sortOrders; 23 protected ArrayList selectables; 25 30 public Query(Report r) { 31 report = r; 32 joins = new ArrayList(); 33 whereClause = null; 34 sortSelectables = new ArrayList(); 35 sortOrders = new ArrayList(); 36 selectables = new ArrayList(); 37 } 38 39 47 public boolean containsReferenceTo(Parameter p) { 48 if (whereClause == null || whereClause.indexOf("{") == -1) 49 return false; 50 51 int pos, endPos; 52 for (pos = 0, endPos = -1; 53 (pos = whereClause.indexOf("{", endPos + 1)) >= 0; 54 pos = endPos + 1) 55 { 56 endPos = whereClause.indexOf("}", pos); 57 if (endPos == -1) 58 return false; 59 60 switch (whereClause.charAt(pos + 1)) { 61 case '@': String idAsString = whereClause.substring(pos + 2, endPos); 63 Formula f = report.findFormula(idAsString); 64 if (f.refersTo(p)) 65 return true; 66 break; 67 case '?': idAsString = whereClause.substring(pos + 2, endPos); 69 if (p.getId().toString().equals(idAsString)) 70 return true; 71 break; 72 } 73 pos = endPos + 1; 74 } 75 76 return false; 77 } 78 79 84 public void addJoin(Join join) { 85 joins.add(join); 86 } 87 88 93 public void addAllJoins(Collection coll) { 94 joins.addAll(coll); 95 } 96 97 102 public void removeJoin(Join join) { 103 joins.remove(join); 104 } 105 106 109 public void clearJoins() { 110 joins.clear(); 111 } 112 113 118 public Iterator joins() { return joins.iterator(); } 119 120 130 public String getEditableWhereClause() { 131 return Expression.expressionToDisplay(report, whereClause); 132 } 133 134 139 public String getWhereClause() { 140 return whereClause; 141 } 142 143 151 public void setEditableWhereClause(String newWhereClause) { 152 setWhereClause(Expression.displayToExpression(report, newWhereClause)); 153 } 154 155 160 public void setWhereClause(String newWhereClause) { 161 whereClause = newWhereClause; 162 } 163 164 174 public void addSort(Selectable sel, int order) { 175 sortSelectables.add(sel); 176 sortOrders.add(new Integer (order)); 177 } 178 179 184 public void removeSort(Selectable sel) { 185 for (int i = 0; i < sortSelectables.size(); ++i) { 189 if (sortSelectables.get(i) == sel) { 190 sortSelectables.remove(i); 191 sortOrders.remove(i); 192 return; 193 } 194 } 195 } 196 197 200 public void clearSorts() { 201 sortSelectables = new ArrayList(); 202 sortOrders = new ArrayList(); 203 } 204 205 210 public Iterator selectables() { return selectables.iterator(); } 211 212 217 public Iterator sortedSelectables() { return sortSelectables.iterator(); } 218 219 229 public int sortOrderOf(Selectable sel) { 230 for (int i = 0; i < sortSelectables.size(); ++i) { 234 if (sortSelectables.get(i) == sel) 235 return ((Integer )sortOrders.get(i)).intValue(); 236 } 237 return SORT_UNDEFINED; 238 } 239 240 245 public int indexOfSelectable(Selectable selectable) { 246 return selectables.indexOf(selectable); 247 } 248 249 252 public void findSelectablesUsed() { 253 257 selectables.clear(); 258 report.withFieldsDo(new FieldWalker() { 259 public void step(Field f) { 260 if (f instanceof ColumnField) { 261 Column col = ((ColumnField)f).getColumn(); 262 if (!selectables.contains(col)) selectables.add(col); 263 } 264 else if (f instanceof FormulaField) { 265 FormulaField ff = (FormulaField)f; 266 for (Iterator iter = ff.columnsUsed().iterator(); 267 iter.hasNext(); ) 268 { 269 Column col = (Column)iter.next(); 270 if (!selectables.contains(col)) selectables.add(col); 271 } 272 for (Iterator iter = ff.userColumnsUsed().iterator(); 273 iter.hasNext(); ) 274 { 275 UserColumn uc = (UserColumn)iter.next(); 276 if (!selectables.contains(uc)) selectables.add(uc); 277 } 278 } 279 else if (f instanceof UserColumnField) { 280 UserColumn uc = ((UserColumnField)f).getUserColumn(); 281 if (!selectables.contains(uc)) selectables.add(uc); 282 } 283 } 284 }); 285 286 for (Iterator iter = report.groups(); iter.hasNext(); ) { 289 Group g = (Group)iter.next(); 290 Selectable s = g.getSelectable(); 291 if (!selectables.contains(s)) selectables.add(s); 292 } 293 294 for (Iterator iter = sortedSelectables(); iter.hasNext(); ) { 296 Selectable s = (Selectable)iter.next(); 297 if (!selectables.contains(s)) selectables.add(s); 298 } 299 300 for (Iterator iter = report.subreports(); iter.hasNext(); ) { 305 Subreport sub = (Subreport)iter.next(); 306 for (Iterator subIter = sub.parentColumns(); subIter.hasNext(); ) { 307 Column col = (Column)subIter.next(); 308 if (!selectables.contains(col)) selectables.add(col); 309 } 310 } 311 } 312 313 320 public int getNumSelectables() { return selectables.size(); } 321 322 334 public void reloadColumns(DataSource dataSource) 335 { 336 for (Iterator iter = joins(); iter.hasNext(); ) { 338 Join j = (Join)iter.next(); 339 j.setFrom(dataSource.findColumn(j.getFrom().getId())); 340 j.setTo(dataSource.findColumn(j.getTo().getId())); 341 } 342 343 ArrayList newSelectables = new ArrayList(); 345 for (Iterator iter = selectables.iterator(); iter.hasNext(); ) { 346 Selectable g = (Selectable)iter.next(); 347 newSelectables.add(g.reloadInstance(dataSource)); 348 } 349 selectables = newSelectables; 350 351 ArrayList newSortCols = new ArrayList(); 353 for (Iterator iter = sortSelectables.iterator(); iter.hasNext(); ) { 354 Selectable s = (Selectable)iter.next(); 355 newSortCols.add(s.reloadInstance(dataSource)); 356 } 357 sortSelectables = newSortCols; 358 } 359 360 366 public void writeXML(XMLWriter out) { 367 out.startElement("query"); 368 369 ListWriter.writeList(out, joins); 370 371 if (whereClause != null && whereClause.length() > 0) 372 out.cdataElement("where", whereClause); 373 374 for (int i = 0; i < sortSelectables.size(); ++i) { 375 int sortOrder = ((Integer )sortOrders.get(i)).intValue(); 376 Selectable selectable = (Selectable)sortSelectables.get(i); 377 out.startElement("sort"); 378 out.attr("order", sortOrder == Query.SORT_DESCENDING ? "desc" : "asc"); 379 out.attr("groupable-id", selectable.getId()); 380 out.attr("groupable-type", selectable.fieldTypeString()); 381 out.endElement(); 382 } 383 writeExtras(out); 384 385 out.endElement(); 386 } 387 388 389 protected void writeExtras(XMLWriter out) { } 390 391 } 392 | Popular Tags |