1 package org.apache.torque.criteria;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.Serializable;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.lang.builder.EqualsBuilder;
27 import org.apache.commons.lang.builder.HashCodeBuilder;
28
29 /**
30 * This class describes an Element in the From-part of a SQL clause.
31 * It must contain the name of the database table.
32 * It might contain an alias for the table name, a join type
33 * a join condition and prepared statement replacements.
34 * The class is immutable.
35 */
36 public class FromElement implements Serializable
37 {
38 /** serial Version UID. */
39 private static final long serialVersionUID = 1L;
40
41 /**
42 * The fromExpression, e.g. a simple table name or a table name
43 * or a subquery with an appended alias name.
44 */
45 private String fromExpression = null;
46
47 /** The type of the join, e.g. JoinType.LEFT_JOIN */
48 private JoinType joinType = null;
49
50 /** The join condition, e.g. table_a.id = table_b.a_id */
51 private String joinCondition = null;
52
53 /** The replacements which might occur in the fromExpression. */
54 private final List<Object> preparedStatementReplacements
55 = new ArrayList<Object>();
56
57 /**
58 * Constructor with join type null and joinCondition null.
59 *
60 * @param tableName the table name, might contain an appended alias name
61 * e.g. <br />
62 * table_1<br />
63 * table_1 alias_for_table_1
64 */
65 public FromElement(String tableName)
66 {
67 this(tableName, null, null, null);
68 }
69
70 /**
71 * Constructor.
72 *
73 * @param fromExpression the expression to add to the from clause,
74 * e.g. a simple table name or a table name with an alias,
75 * e.g. <br />
76 * table_1<br />
77 * table_1 alias_for_table_1
78 * @param joinType the type of the join, e.g. JoinType.LEFT_JOIN,
79 * or null if no excplicit join is wanted
80 * @param joinCondition the join condition,
81 * e.g. table_a.id = table_b.a_id,
82 * or null if no explicit join is wanted
83 * (In this case, the join condition is appended to the
84 * whereClause instead)
85 */
86 public FromElement(
87 String fromExpression,
88 JoinType joinType,
89 String joinCondition)
90 {
91 this(fromExpression, joinType, joinCondition, null);
92 }
93
94 /**
95 * Constructor.
96 *
97 * @param fromExpression the expression to add to the from clause,
98 * e.g. a simple table name or a table name with an alias,
99 * e.g. <br />
100 * table_1<br />
101 * table_1 alias_for_table_1
102 * @param joinType the type of the join, e.g. JoinType.LEFT_JOIN,
103 * or null if no explicit join is wanted
104 * @param joinCondition the join condition,
105 * e.g. table_a.id = table_b.a_id,
106 * or null if no explicit join is wanted
107 * (In this case, the join condition is appended to the
108 * whereClause instead)
109 * @param preparedStatementReplacements the replacements for placeholders
110 * which might occur in the fromExpression, may be null.
111 */
112 public FromElement(
113 String fromExpression,
114 JoinType joinType,
115 String joinCondition,
116 List<Object> preparedStatementReplacements)
117 {
118 this.fromExpression = fromExpression;
119 this.joinType = joinType;
120 this.joinCondition = joinCondition;
121 if (preparedStatementReplacements != null)
122 {
123 this.preparedStatementReplacements.addAll(
124 preparedStatementReplacements);
125 }
126 }
127
128 /**
129 * Constructor.
130 *
131 * @param fromExpression the expression to add to the from clause,
132 * e.g. a simple table name or a table name with an alias,
133 * e.g. <br />
134 * table_1<br />
135 * table_1 alias_for_table_1
136 * @param joinType the type of the join, e.g. JoinType.LEFT_JOIN,
137 * or null if no explicit join is wanted
138 * @param joinCondition the join condition,
139 * e.g. table_a.id = table_b.a_id, not null.
140 */
141 public FromElement(
142 String fromExpression,
143 JoinType joinType,
144 PreparedStatementPart joinCondition)
145 {
146 this(fromExpression,
147 joinType,
148 joinCondition.getSql().toString(),
149 joinCondition.getPreparedStatementReplacements());
150 }
151
152
153 /**
154 * Returns the join condition.
155 *
156 * @return the join condition, e.g. table_a.id = table_b.a_id,
157 * or null if the join is not an explicit join
158 */
159 public String getJoinCondition()
160 {
161 return joinCondition;
162 }
163
164 /**
165 * Returns the join type.
166 *
167 * @return the type of the join, e.g. JoinType.LEFT_JOIN,
168 * or null if the join is not an explicit join
169 */
170 public JoinType getJoinType()
171 {
172 return joinType;
173 }
174
175 /**
176 * Returns the fromExpression, which might e.g. be a simple table name or
177 * a table name or a subquery with an alias appended.
178 *
179 * @return the tablename, might contain an appended alias name,
180 * e.g. <br />
181 * table_1<br />
182 * table_1 alias_for_table_1
183 *
184 */
185 public String getFromExpression()
186 {
187 return fromExpression;
188 }
189
190 /**
191 * Returns the replacements for prepared statement placeholders in the
192 * fromExpression.
193 *
194 * @return the replacements, not null.
195
196 */
197 public List<Object> getPreparedStatementReplacements()
198 {
199 return preparedStatementReplacements;
200 }
201
202 /**
203 * Returns a SQL representation of the element.
204 *
205 * @return a SQL representation of the element
206 */
207 @Override
208 public String toString()
209 {
210 StringBuffer result = new StringBuffer();
211 if (joinType != null)
212 {
213 result.append(joinType);
214 }
215 result.append(fromExpression);
216 if (joinCondition != null)
217 {
218 result.append(SqlEnum.ON);
219 result.append(joinCondition);
220 }
221 return result.toString();
222 }
223
224
225 @Override
226 public int hashCode()
227 {
228 return new HashCodeBuilder()
229 .append(joinCondition)
230 .append(joinType)
231 .append(fromExpression)
232 .append(preparedStatementReplacements)
233 .toHashCode();
234 }
235
236
237 @Override
238 public boolean equals(Object obj)
239 {
240 if (this == obj)
241 {
242 return true;
243 }
244 if (obj == null)
245 {
246 return false;
247 }
248 if (getClass() != obj.getClass())
249 {
250 return false;
251 }
252 FromElement other = (FromElement) obj;
253 return new EqualsBuilder()
254 .append(joinCondition, other.joinCondition)
255 .append(joinType, other.joinType)
256 .append(fromExpression, other.fromExpression)
257 .append(preparedStatementReplacements,
258 other.preparedStatementReplacements)
259 .isEquals();
260 }
261 }