View Javadoc

1   package org.apache.torque.util;
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  /**
23   * This is a utility class which eases counting of Datasets
24   *
25   * @author <a href="mailto:Martin.Goulet@sungard.com">Martin Goulet</a>
26   * @author <a href="mailto:eric.lambert@sungard.com">Eric Lambert</a>
27   * @author <a href="mailto:sebastien.paquette@sungard.com">Sebastien Paquette</a>
28   * @author <a href="mailto:fischer@seitenbau.de">Thomas Fischer</a>
29   * @version $Id: CountHelper.java 1379317 2012-08-31 06:56:48Z tfischer $
30   */
31  import java.sql.Connection;
32  import java.util.List;
33  
34  import org.apache.torque.Column;
35  import org.apache.torque.ColumnImpl;
36  import org.apache.torque.Torque;
37  import org.apache.torque.TorqueException;
38  import org.apache.torque.criteria.SqlEnum;
39  import org.apache.torque.map.TableMap;
40  import org.apache.torque.om.mapper.IntegerMapper;
41  import org.apache.torque.util.functions.Count;
42  
43  /**
44   * Counts entries matching a criteria.
45   */
46  public class CountHelper
47  {
48      /**
49       * The COUNT function returns the number of rows in a query.
50       * Does not use a connection, hardcode the column to "*" and
51       * set the distinct qualifier to false.
52       * Only use this function if you have added additional constraints to
53       * the criteria, otherwise Torque does not know which table it should
54       * count the datasets in.
55       *
56       * @param c Criteria to get the count for.
57       * @return number of rows matching the query provided
58       * @throws TorqueException if the query could not be executed
59       *
60       * @deprecated use org.apache.toraue.criteria.Criteria instead of
61       *             org.apache.toraue.util.Criteria. This method will be removed
62       *             in Torque 4.1.
63       */
64      @Deprecated
65      public int count(Criteria c) throws TorqueException
66      {
67          return count(c, null, "*", null);
68      }
69  
70      /**
71       * The COUNT function returns the number of rows in a query.
72       * Does not use a connection, hardcode the column to "*" and
73       * set the distinct qualifier to false.
74       * Only use this function if you have added additional constraints to
75       * the criteria, otherwise Torque does not know which table it should
76       * count the datasets in.
77       *
78       * @param c Criteria to get the count for.
79       * @return number of rows matching the query provided
80       * @throws TorqueException if the query could not be executed
81       */
82      public int count(org.apache.torque.criteria.Criteria c)
83              throws TorqueException
84      {
85          return count(c, null, "*", null);
86      }
87  
88      /**
89       * The COUNT function returns the number of rows in a query.
90       * Hard code the distinct parameter to false and set the column to "*".
91       * Only use this function if you have added additional constraints to
92       * the criteria, otherwise Torque does not know which table it should
93       * count the datasets in.
94       *
95       * @param c Criteria to get the count for.
96       * @param conn Connection to use
97       * @return number of rows matching the query provided
98       * @throws TorqueException if the query could not be executed
99       *
100      * @deprecated use org.apache.toraue.criteria.Criteria instead of
101      *             org.apache.toraue.util.Criteria. This method will be removed
102      *             in Torque 4.1.
103      */
104     @Deprecated
105     public int count(Criteria c, Connection conn) throws TorqueException
106     {
107         return count(c, conn, "*", null);
108     }
109 
110     /**
111      * The COUNT function returns the number of rows in a query.
112      * Hard code the distinct parameter to false and set the column to "*".
113      * Only use this function if you have added additional constraints to
114      * the criteria, otherwise Torque does not know which table it should
115      * count the datasets in.
116      *
117      * @param c Criteria to get the count for.
118      * @param conn Connection to use
119      * @return number of rows matching the query provided
120      * @throws TorqueException if the query could not be executed
121      */
122     public int count(org.apache.torque.criteria.Criteria c, Connection conn)
123             throws TorqueException
124     {
125         return count(c, conn, "*", null);
126     }
127 
128     /**
129      * Returns the number of rows in a query.
130      *
131      * @param c Criteria to get the count for.
132      * @param columnName Name of database Column which is counted. Preferably,
133      *        use the primary key here.
134      * @return number of rows matching the query provided
135      * @throws TorqueException if the query could not be executed
136      *
137      * @deprecated use org.apache.toraue.criteria.Criteria instead of
138      *             org.apache.toraue.util.Criteria. This method will be removed
139      *             in Torque 4.1.
140      */
141     @Deprecated
142     public int count(Criteria c, String columnName)
143         throws TorqueException
144     {
145         return count(c, null, columnName, null);
146     }
147 
148     /**
149      * Returns the number of rows in a query.
150      *
151      * @param c Criteria to get the count for.
152      * @param columnName Name of database Column which is counted. Preferably,
153      *        use the primary key here.
154      * @return number of rows matching the query provided
155      * @throws TorqueException if the query could not be executed
156      */
157     public int count(org.apache.torque.criteria.Criteria c, String columnName)
158         throws TorqueException
159     {
160         return count(c, null, columnName, null);
161     }
162 
163     /**
164      * Returns the number of rows in a query.
165      *
166      * @param c Criteria to get the count for.
167      * @param column the database Column which is counted. Preferably,
168      *        use the primary key here.
169      * @return number of rows matching the query provided
170      * @throws TorqueException if the query could not be executed
171      *
172      * @deprecated use org.apache.toraue.criteria.Criteria instead of
173      *             org.apache.toraue.util.Criteria. This method will be removed
174      *             in Torque 4.1.
175      */
176     @Deprecated
177     public int count(Criteria c, Column column)
178         throws TorqueException
179     {
180         return count(c, null, column.getSqlExpression(), null);
181     }
182 
183     /**
184      * Returns the number of rows in a query.
185      *
186      * @param c Criteria to get the count for.
187      * @param column the database Column which is counted. Preferably,
188      *        use the primary key here.
189      * @return number of rows matching the query provided
190      * @throws TorqueException if the query could not be executed
191      */
192     public int count(org.apache.torque.criteria.Criteria c, Column column)
193         throws TorqueException
194     {
195         return count(c, column.getSqlExpression());
196     }
197 
198     /**
199      * Returns the number of rows in a query.
200      *
201      * @param c Criteria to get the count for.
202      * @param conn Connection to use
203      * @param column The database Column which is counted. Preferably,
204      *        use the primary key here.
205      * @return number of rows matching the query provided
206      * @throws TorqueException if the query could not be executed
207      *
208      * @deprecated use org.apache.toraue.criteria.Criteria instead of
209      *             org.apache.toraue.util.Criteria. This method will be removed
210      *             in Torque 4.1.
211      */
212     @Deprecated
213     public int count(Criteria c, Connection conn, Column column)
214         throws TorqueException
215     {
216         return count(c, conn, column.getSqlExpression(), null);
217     }
218 
219     /**
220      * Returns the number of rows in a query.
221      *
222      * @param c Criteria to get the count for.
223      * @param conn Connection to use
224      * @param column The database Column which is counted. Preferably,
225      *        use the primary key here.
226      * @return number of rows matching the query provided
227      * @throws TorqueException if the query could not be executed
228      */
229     public int count(
230             org.apache.torque.criteria.Criteria c,
231             Connection conn,
232             Column column)
233         throws TorqueException
234     {
235         return count(c, conn, column.getSqlExpression(), null);
236     }
237 
238     /**
239      * Counts all rows in a table.
240      *
241      * @param tableMap the table map of the table to count rows in.
242      *
243      * @return the number of rows in the table.
244      *
245      * @throws TorqueException if the query could not be executed
246      */
247     public int count(TableMap tableMap)
248         throws TorqueException
249     {
250         return count(
251                 new org.apache.torque.criteria.Criteria(),
252                 null,
253                 "*",
254                 tableMap);
255     }
256 
257     /**
258      * Counts all rows in a table.
259      *
260      * @param tableMap the table map of the table to count rows in.
261      * @param conn the connection to use.
262      *
263      * @return the number of rows in the table.
264      *
265      * @throws TorqueException if the query could not be executed
266      */
267     public int count(TableMap tableMap, Connection conn)
268             throws TorqueException
269     {
270         return count(
271                 new org.apache.torque.criteria.Criteria(),
272                 conn,
273                 "*",
274                 tableMap);
275     }
276 
277     /**
278      * Returns the number of rows in a query.
279      *
280      * @param c Criteria to get the count for.
281      * @param conn Connection to use
282      * @param columnName Name of database Column which is counted. Preferably,
283      *        use the primary key here.
284      * @param tableMap the table to count the columns in, or null to determine
285      *        the table automatically from the criteria.
286      *
287      * @return number of rows matching the query provided.
288      *
289      * @throws TorqueException if the query could not be executed.
290      *
291      * @deprecated use org.apache.toraue.criteria.Criteria instead of
292      *             org.apache.toraue.util.Criteria. This method will be removed
293      *             in Torque 4.1.
294      */
295     @Deprecated
296     public int count(
297                 Criteria c,
298                 Connection conn,
299                 String columnName,
300                 TableMap tableMap)
301             throws TorqueException
302     {
303         /* Clear the select columns. */
304         c.getSelectColumns().clear();
305         c.getOrderByColumns().clear();
306         c.getGroupByColumns().clear();
307 
308         UniqueList<String> criteriaSelectModifiers
309             = c.getSelectModifiers();
310 
311         boolean distinct = false;
312         if (criteriaSelectModifiers != null
313             && criteriaSelectModifiers.size() > 0
314             && criteriaSelectModifiers.contains(SqlEnum.DISTINCT.toString()))
315         {
316             criteriaSelectModifiers.remove(SqlEnum.DISTINCT.toString());
317             distinct = true;
318         }
319 
320         c.addSelectColumn(new Count(new ColumnImpl(columnName), distinct));
321 
322         String databaseName = (c.getDbName() == null)
323                 ? Torque.getDefaultDB()
324                 : c.getDbName();
325 
326         BasePeerImpl<Integer> peer = new BasePeerImpl<Integer>(
327                 new IntegerMapper(),
328                 tableMap, databaseName);
329 
330         List<Integer> result = (conn == null)
331             ? peer.doSelect(c)
332             : peer.doSelect(c, conn);
333 
334         return result.get(0);
335     }
336 
337     /**
338      * Returns the number of rows in a query.
339      *
340      * @param c Criteria to get the count for.
341      * @param conn Connection to use
342      * @param columnName Name of database Column which is counted. Preferably,
343      *        use the primary key here.
344      * @param tableMap the table to count the columns in, or null to determine
345      *        the table automatically from the criteria.
346      *
347      * @return number of rows matching the query provided.
348      *
349      * @throws TorqueException if the query could not be executed.
350      */
351     public int count(
352                 org.apache.torque.criteria.Criteria c,
353                 Connection conn,
354                 String columnName,
355                 TableMap tableMap)
356             throws TorqueException
357     {
358         /* Clear the select columns. */
359         c.getSelectColumns().clear();
360         c.getOrderByColumns().clear();
361         c.getGroupByColumns().clear();
362 
363         UniqueList<String> criteriaSelectModifiers
364             = c.getSelectModifiers();
365 
366         boolean distinct = false;
367         if (criteriaSelectModifiers != null
368             && criteriaSelectModifiers.size() > 0
369             && criteriaSelectModifiers.contains(SqlEnum.DISTINCT.toString()))
370         {
371             criteriaSelectModifiers.remove(SqlEnum.DISTINCT.toString());
372             distinct = true;
373         }
374 
375         c.addSelectColumn(new Count(new ColumnImpl(columnName), distinct));
376 
377         String databaseName = (c.getDbName() == null)
378                 ? Torque.getDefaultDB()
379                 : c.getDbName();
380 
381         BasePeerImpl<Integer> peer = new BasePeerImpl<Integer>(
382                 new IntegerMapper(),
383                 tableMap, databaseName);
384 
385         List<Integer> result = (conn == null)
386             ? peer.doSelect(c)
387             : peer.doSelect(c, conn);
388 
389         return result.get(0);
390     }
391 }