KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jimm > datavision > source > sql > SubreportQuery


1 package jimm.datavision.source.sql;
2 import jimm.datavision.*;
3 import jimm.datavision.source.*;
4 import jimm.util.XMLWriter;
5 import java.util.*;
6 import java.sql.PreparedStatement JavaDoc;
7 import java.sql.SQLException JavaDoc;
8
9 /**
10  * Queries build SQL query strings. They contain tables, joins, and
11  * where clauses.
12  *
13  * @author Jim Menard, <a HREF="mailto:jimm@io.com">jimm@io.com</a>
14  * @see ParserHelper
15  */

16 public class SubreportQuery extends SQLQuery {
17
18 protected Subreport subreport;
19 protected ArrayList subreportJoins;
20
21 /**
22  * Constructor.
23  *
24  * @param report the report for which this query will generate SQL
25  */

26 public SubreportQuery(Subreport report) {
27     super(report);
28     subreport = report;
29     subreportJoins = new ArrayList();
30 }
31
32 public void addSubreportJoin(Join join) {
33     subreportJoins.add(join);
34 }
35
36 public void addSubreportJoins(Collection coll) {
37     subreportJoins.addAll(coll);
38 }
39
40 /**
41  * Returns an iterator over all of the columns that need to be included in
42  * the parent report's query so that the values are available to this
43  * subreport when it builds its query.
44  *
45  * @return an iterator over selectables
46  */

47 public Iterator parentColumns() {
48     ArrayList list = new ArrayList();
49     for (Iterator iter = subreportJoins.iterator(); iter.hasNext(); )
50     list.add(((Join)iter.next()).getFrom());
51     return list.iterator();
52 }
53
54 protected void buildWhereClause(StringBuffer JavaDoc str, boolean forDisplay) {
55     // We always have a where clauses, even if the user didn't specify one
56
str.append(" where ");
57     if (!joins.isEmpty()) {
58     buildJoins(str);
59     str.append(" and ");
60     }
61     buildUserWhereClause(str, forDisplay);
62 }
63
64 public String JavaDoc getWhereClauseForDisplay() {
65     StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
66     if (whereClause != null && whereClause.length() > 0) {
67     buf.append('(');
68     buf.append(super.getWhereClauseForPreparedStatement());
69     buf.append(") and (");
70     }
71     for (Iterator iter = subreportJoins.iterator(); iter.hasNext(); ) {
72     Join j = (Join)iter.next();
73     buf.append(((Column)j.getFrom()).fullName());
74     buf.append(' ');
75     buf.append(j.getRelation());
76     buf.append(' ');
77     buf.append(quoted(((Column)j.getTo()).fullName()));
78     if (iter.hasNext())
79         buf.append(" and ");
80     }
81     if (whereClause != null && whereClause.length() > 0)
82     buf.append(')');
83     return buf.toString();
84 }
85
86 public String JavaDoc getWhereClauseForPreparedStatement() {
87     StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
88     if (whereClause != null && whereClause.length() > 0) {
89     buf.append('(');
90     buf.append(super.getWhereClauseForPreparedStatement());
91     buf.append(") and (");
92     }
93     for (Iterator iter = subreportJoins.iterator(); iter.hasNext(); ) {
94     Join j = (Join)iter.next();
95     buf.append("? ");
96     buf.append(j.getRelation());
97     buf.append(' ');
98     buf.append(quoted(((Column)j.getTo()).fullName()));
99     if (iter.hasNext())
100         buf.append(" and ");
101     }
102     if (whereClause != null && whereClause.length() > 0)
103     buf.append(')');
104     return buf.toString();
105 }
106
107 public void setParameters(PreparedStatement JavaDoc stmt) throws SQLException JavaDoc {
108     super.setParameters(stmt);
109
110     // Continue with parameters after those filled in by superclass.
111
// Remember that param indices start at 1.
112
int i = preparedStmtValues.size() + 1;
113     for (Iterator iter = subreportJoins.iterator(); iter.hasNext(); ++i) {
114     // In Oracle, Java Dates are turned into timestamps, or something
115
// like that. This is an attempt to fix this problem.
116
Column from = ((Join)iter.next()).getFrom();
117     Object JavaDoc val = subreport.getParentReport().columnValue(from);
118     if (val instanceof java.util.Date JavaDoc)
119         stmt.setDate(i,
120              new java.sql.Date JavaDoc(((java.util.Date JavaDoc)val).getTime()));
121     else
122         stmt.setObject(i, val);
123     }
124 }
125
126 protected void writeExtras(XMLWriter out) {
127     out.startElement("subreport-joins");
128     for (Iterator iter = subreportJoins.iterator(); iter.hasNext(); )
129     ((Join)iter.next()).writeXML(out);
130     out.endElement();
131 }
132
133 }
134
Popular Tags