View Javadoc

1   package org.apache.torque.util;
2   
3   /*
4    * Copyright 2001-2004 The Apache Software Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License")
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  /***
20   * This is a utility class which eases counting of Datasets
21   *
22   * @author <a href="mailto:Martin.Goulet@sungard.com">Martin Goulet</a>
23   * @author <a href="mailto:eric.lambert@sungard.com">Eric Lambert</a>
24   * @author <a href="mailto:sebastien.paquette@sungard.com">Sebastien Paquette</a>
25   * @author <a href="mailto:fischer@seitenbau.de">Thomas Fischer</a>
26   * @version $Id: CountHelper.java,v 1.2 2005/01/31 19:43:52 tfischer Exp $
27   */
28  import java.sql.Connection;
29  import java.util.List;
30  
31  import org.apache.torque.TorqueException;
32  
33  import com.workingdogs.village.DataSetException;
34  import com.workingdogs.village.Record;
35  
36  public class CountHelper 
37  {  
38      /***
39       * The COUNT function returns the number of rows in a query. 
40       * Does not use a connection, hardcode the column to "*" and 
41       * set the distinct qualifier to false.
42       * Only use this function if you have added additional constraints to
43       * the criteria, otherwise Torque does not know which table it should
44       * count the datasets in.
45       * 
46       * @param c Criteria to get the count for.
47       * @return number of rows matching the query provided
48       * @throws TorqueException if the query could not be executed
49       */
50      public int count( Criteria c ) throws TorqueException
51      {
52          return count( c, null, "*" );
53      }
54  
55      /***
56       * The COUNT function returns the number of rows in a query. 
57       * Hard code the distinct parameter to false and set the column to "*".
58       * Only use this function if you have added additional constraints to
59       * the criteria, otherwise Torque does not know which table it should
60       * count the datasets in.
61       * 
62       * @param c Criteria to get the count for.
63       * @param conn Connection to use
64       * @return number of rows matching the query provided
65       * @throws TorqueException if the query could not be executed
66       */    
67      public int count( Criteria c, Connection conn ) throws TorqueException
68      {
69          return count( c, conn, "*" );       
70      }
71  
72      /***
73       * Returns the number of rows in a query.
74       * 
75       * @param c Criteria to get the count for.
76       * @param columnName Name of database Column which is counted. Preferably,
77       *        use the primary key here.
78       * @return number of rows matching the query provided
79       * @throws TorqueException if the query could not be executed
80       */
81      public int count( Criteria c, String columnName ) 
82          throws TorqueException
83      {
84          return count( c, null, columnName );
85      }
86  
87      /***
88       * Returns the number of rows in a query. 
89       * 
90       * @param c Criteria to get the count for.
91       * @param conn Connection to use
92       * @param columnName Name of database Column which is counted. Preferably,
93       *        use the primary key here.
94       * @return number of rows matching the query provided
95       * @throws TorqueException if the query could not be executed
96       */
97      public int count( Criteria c, Connection conn, String columnName ) 
98          throws TorqueException
99      {        
100         /* Clear the select columns. */
101         c.getSelectColumns().clear();
102         c.getOrderByColumns().clear();
103         c.getGroupByColumns().clear();
104 
105         UniqueList criteriaSelectModifiers;
106         criteriaSelectModifiers = c.getSelectModifiers();
107 
108         boolean distinct = false;
109         if( criteriaSelectModifiers != null && 
110             criteriaSelectModifiers.size() > 0 && 
111             criteriaSelectModifiers.contains( SqlEnum.DISTINCT.toString() ) )
112     	{
113             criteriaSelectModifiers.remove( SqlEnum.DISTINCT.toString() );
114             distinct = true;
115         }
116 
117         StringBuffer countStr = new StringBuffer( "COUNT(" );
118         countStr.append( distinct == true ? SqlEnum.DISTINCT.toString() : "" );
119         countStr.append( columnName );
120         countStr.append( ")" );
121 
122         c.addSelectColumn( countStr.toString() );
123 
124         List result;
125         if( conn == null )
126         {
127             result = BasePeer.doSelect( c );
128         }
129         else
130     	{
131             result = BasePeer.doSelect( c, conn );
132         } 
133         Record record = (Record) result.get(0);
134         try {
135             return record.getValue(1).asInt();
136         }
137         catch (DataSetException e) {
138             throw new TorqueException(e);
139         }
140     }
141 }