001: package org.apache.torque.util;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: /**
023: * This is a utility class which eases counting of Datasets
024: *
025: * @author <a href="mailto:Martin.Goulet@sungard.com">Martin Goulet</a>
026: * @author <a href="mailto:eric.lambert@sungard.com">Eric Lambert</a>
027: * @author <a href="mailto:sebastien.paquette@sungard.com">Sebastien Paquette</a>
028: * @author <a href="mailto:fischer@seitenbau.de">Thomas Fischer</a>
029: * @version $Id: CountHelper.java 473821 2006-11-11 22:37:25Z tv $
030: */
031: import java.sql.Connection;
032: import java.util.List;
033:
034: import org.apache.torque.TorqueException;
035:
036: import com.workingdogs.village.DataSetException;
037: import com.workingdogs.village.Record;
038:
039: public class CountHelper {
040: /**
041: * The COUNT function returns the number of rows in a query.
042: * Does not use a connection, hardcode the column to "*" and
043: * set the distinct qualifier to false.
044: * Only use this function if you have added additional constraints to
045: * the criteria, otherwise Torque does not know which table it should
046: * count the datasets in.
047: *
048: * @param c Criteria to get the count for.
049: * @return number of rows matching the query provided
050: * @throws TorqueException if the query could not be executed
051: */
052: public int count(Criteria c) throws TorqueException {
053: return count(c, null, "*");
054: }
055:
056: /**
057: * The COUNT function returns the number of rows in a query.
058: * Hard code the distinct parameter to false and set the column to "*".
059: * Only use this function if you have added additional constraints to
060: * the criteria, otherwise Torque does not know which table it should
061: * count the datasets in.
062: *
063: * @param c Criteria to get the count for.
064: * @param conn Connection to use
065: * @return number of rows matching the query provided
066: * @throws TorqueException if the query could not be executed
067: */
068: public int count(Criteria c, Connection conn)
069: throws TorqueException {
070: return count(c, conn, "*");
071: }
072:
073: /**
074: * Returns the number of rows in a query.
075: *
076: * @param c Criteria to get the count for.
077: * @param columnName Name of database Column which is counted. Preferably,
078: * use the primary key here.
079: * @return number of rows matching the query provided
080: * @throws TorqueException if the query could not be executed
081: */
082: public int count(Criteria c, String columnName)
083: throws TorqueException {
084: return count(c, null, columnName);
085: }
086:
087: /**
088: * Returns the number of rows in a query.
089: *
090: * @param c Criteria to get the count for.
091: * @param conn Connection to use
092: * @param columnName Name of database Column which is counted. Preferably,
093: * use the primary key here.
094: * @return number of rows matching the query provided
095: * @throws TorqueException if the query could not be executed
096: */
097: public int count(Criteria c, Connection conn, String columnName)
098: throws TorqueException {
099: /* Clear the select columns. */
100: c.getSelectColumns().clear();
101: c.getOrderByColumns().clear();
102: c.getGroupByColumns().clear();
103:
104: UniqueList criteriaSelectModifiers;
105: criteriaSelectModifiers = c.getSelectModifiers();
106:
107: boolean distinct = false;
108: if (criteriaSelectModifiers != null
109: && criteriaSelectModifiers.size() > 0
110: && criteriaSelectModifiers.contains(SqlEnum.DISTINCT
111: .toString())) {
112: criteriaSelectModifiers.remove(SqlEnum.DISTINCT.toString());
113: distinct = true;
114: }
115:
116: StringBuffer countStr = new StringBuffer("COUNT(");
117: countStr.append(distinct ? SqlEnum.DISTINCT.toString() : "");
118: countStr.append(columnName);
119: countStr.append(")");
120:
121: c.addSelectColumn(countStr.toString());
122:
123: List result;
124: if (conn == null) {
125: result = BasePeer.doSelect(c);
126: } else {
127: result = BasePeer.doSelect(c, conn);
128: }
129:
130: Record record = (Record) result.get(0);
131: try {
132: return record.getValue(1).asInt();
133: } catch (DataSetException e) {
134: throw new TorqueException(e);
135: }
136: }
137: }
|