Author: tfischer
Date: Sun Jun 23 21:14:56 2013
New Revision: 1495892
URL: http://svn.apache.org/r1495892
Log:
TORQUE-289: Summary Helper not setting replacements
Added:
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/SummaryHelperTest.java
Modified:
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/SummaryHelperTest.java
Modified:
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
URL:
http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java?rev=1495892&r1=1495891&r2=1495892&view=diff
==============================================================================
---
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
(original)
+++
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
Sun Jun 23 21:14:56 2013
@@ -22,9 +22,6 @@ package org.apache.torque.util;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -35,12 +32,11 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.Column;
import org.apache.torque.ColumnImpl;
+import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.criteria.Criteria;
import org.apache.torque.criteria.SqlEnum;
import org.apache.torque.om.mapper.ObjectListMapper;
-import org.apache.torque.om.mapper.RecordMapper;
-import org.apache.torque.sql.SqlBuilder;
import org.apache.torque.util.functions.SQLFunction;
/**
@@ -206,64 +202,23 @@ public class SummaryHelper
throws TorqueException
{
Criteria c = buildCriteria(crit);
- // TODO use BasePeerImpl.doSelect instead of parsing the result
manually
- String query = SqlBuilder.buildQuery(c).toString();
- RecordMapper<List<Object>> mapper = new ObjectListMapper(resultTypes);
-
- Statement statement = null;
- ResultSet resultSet = null;
- List<List<Object>> rows = new ArrayList<List<Object>>();
- try
- {
- statement = conn.createStatement();
- long startTime = System.currentTimeMillis();
- logger.debug("Executing query " + query);
-
- resultSet = statement.executeQuery(query.toString());
- long queryEndTime = System.currentTimeMillis();
- logger.trace("query took " + (queryEndTime - startTime)
- + " milliseconds");
- while (resultSet.next())
- {
- List<Object> rowResult = mapper.processRow(resultSet, 0, null);
- rows.add(rowResult);
- }
- long mappingEndTime = System.currentTimeMillis();
- logger.trace("mapping took " + (mappingEndTime - queryEndTime)
- + " milliseconds");
- }
- catch (SQLException e)
- {
- throw new TorqueException(e);
- }
- finally
- {
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- logger.warn("error closing resultSet", e);
- }
- }
- if (statement != null)
- {
- try
- {
- statement.close();
- }
- catch (SQLException e)
- {
- logger.warn("error closing statement", e);
- }
- }
- }
+ String databaseName = (c.getDbName() == null)
+ ? Torque.getDefaultDB()
+ : c.getDbName();
+ c.setDbName(databaseName);
+
+ BasePeerImpl<List<Object>> peer = new BasePeerImpl<List<Object>>(
+ new ObjectListMapper(resultTypes),
+ null, databaseName);
+
+ // use extra ObjectListMapper in doSelect to avoid addSelectcolumns()
+ // call in peer.doSelect(c, conn)
+ List<List<Object>> rows
+ = peer.doSelect(c, new ObjectListMapper(resultTypes), conn);
- List<ListOrderedMapCI> resultsList = new
Vector<ListOrderedMapCI>(rows.size());
+ List<ListOrderedMapCI> resultsList
+ = new ArrayList<ListOrderedMapCI>(rows.size());
List<String> columnNames = new ArrayList<String>();
for (Column column : c.getSelectColumns())
{
@@ -396,7 +351,7 @@ public class SummaryHelper
*
* @param alias A valid SQL99 column identifier ([_A-Z0-9] no spaces and
* no key words, e.g. function names.
- * @param function One of the inner classes from the Aggregate class.
+ * @param function An aggregate SQL function to evaluate.
*/
public void addAggregate(final String alias, final SQLFunction function)
{
Modified:
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
URL:
http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java?rev=1495892&r1=1495891&r2=1495892&view=diff
==============================================================================
---
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
(original)
+++
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
Sun Jun 23 21:14:56 2013
@@ -47,7 +47,9 @@ import org.apache.torque.om.NumberKey;
import org.apache.torque.om.ObjectKey;
import org.apache.torque.om.mapper.CompositeMapper;
import org.apache.torque.om.mapper.IntegerMapper;
+import org.apache.torque.om.mapper.ObjectListMapper;
import org.apache.torque.om.mapper.StringMapper;
+import org.apache.torque.util.functions.Count;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -90,6 +92,7 @@ public class BasePeerImplTest extends Ba
super.setUp();
basePeerImpl.setTableMap(tableMap);
basePeerImpl.setDatabaseName("databaseName");
+ basePeerImpl.setRecordMapper(new ObjectListMapper());
oldTransactionManager = Transaction.getTransactionManager();
MockitoAnnotations.initMocks(this);
when(connection.prepareStatement((String) any()))
@@ -115,7 +118,7 @@ public class BasePeerImplTest extends Ba
}
/**
- * Check that a doSelect.
+ * Check that a basic doSelect works.
*
* @throws Exception if the test fails.
*/
@@ -138,6 +141,13 @@ public class BasePeerImplTest extends Ba
List<List<Object>> result = basePeerImpl.doSelect(
criteria, mapper);
+ // verify no additional select columns are added
+ UniqueColumnList selectColumns = criteria.getSelectColumns();
+ assertEquals(2, selectColumns.size());
+ assertSame(stringColumnMap, selectColumns.get(0));
+ assertSame(integerColumnMap, selectColumns.get(1));
+
+
// verify mock (verification order not relevant)
verify(connection).prepareStatement(
"SELECT TABLE.COLUMN1, TABLE.COLUMN4 FROM TABLE LIMIT 1 OFFSET
2");
@@ -213,6 +223,55 @@ public class BasePeerImplTest extends Ba
}
/**
+ * Checks that doSelect ads the select columns if no select columns were
+ * already added.
+ *
+ * @throws Exception if the test fails.
+ */
+ public void testDoSelectNoSelectColumnsPresent() throws Exception
+ {
+ // prepare
+ Criteria criteria = new Criteria();
+ basePeerImpl.setDatabaseName(Torque.getDefaultDB());
+
+ // execute
+ basePeerImpl.doSelect(criteria, connection);
+
+ // verify
+ UniqueColumnList selectColumns = criteria.getSelectColumns();
+ assertEquals(4, selectColumns.size());
+ assertSame(stringColumnMap, selectColumns.get(0));
+ assertSame(stringColumnMap2, selectColumns.get(1));
+ assertSame(stringColumnMap3, selectColumns.get(2));
+ assertSame(integerColumnMap, selectColumns.get(3));
+ }
+
+ /**
+ * Checks that doSelect does add Select Columns if an AsColumn was already
+ * added.
+ *
+ * @throws Exception if the test fails.
+ */
+ public void testAddSelectColumnsWithAsColumns() throws Exception
+ {
+ // prepare
+ Criteria criteria = new Criteria();
+ criteria.addAsColumn("asColumnName", new Count("*"));
+ basePeerImpl.setDatabaseName(Torque.getDefaultDB());
+
+ // execute
+ basePeerImpl.doSelect(criteria, connection);
+
+ // verify
+ UniqueColumnList selectColumns = criteria.getSelectColumns();
+ assertEquals(4, selectColumns.size());
+ assertSame(stringColumnMap, selectColumns.get(0));
+ assertSame(stringColumnMap2, selectColumns.get(1));
+ assertSame(stringColumnMap3, selectColumns.get(2));
+ assertSame(integerColumnMap, selectColumns.get(3));
+ }
+
+ /**
* Check that the fetch size gets set on the prepared statement when
* set in the criteria.
*
Added:
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/SummaryHelperTest.java
URL:
http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/SummaryHelperTest.java?rev=1495892&view=auto
==============================================================================
---
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/SummaryHelperTest.java
(added)
+++
db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/SummaryHelperTest.java
Sun Jun 23 21:14:56 2013
@@ -0,0 +1,167 @@
+package org.apache.torque.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.util.List;
+
+import org.apache.torque.BaseTestCase;
+import org.apache.torque.Torque;
+import org.apache.torque.criteria.Criteria;
+import org.apache.torque.map.ColumnMap;
+import org.apache.torque.map.DatabaseMap;
+import org.apache.torque.map.TableMap;
+import org.apache.torque.util.functions.Count;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Test class for SummaryHelper.
+ *
+ * @version $Id: CriteriaTest.java 1448414 2013-02-20 21:06:35Z tfischer $
+ */
+public class SummaryHelperTest extends BaseTestCase
+{
+ /** System under Test. */
+ private SummaryHelper summary;
+
+ /** The criteria to use in the test. */
+ private Criteria criteria;
+
+ private TableMap tableMap;
+
+ private ColumnMap columnMap1;
+
+ private ColumnMap columnMap2;
+
+ private ColumnMap columnMap3;
+
+ private ColumnMap columnMap4;
+
+ /** Mock db connection. */
+ @Mock
+ private Connection connection;
+
+ /** Mock prepared statement. */
+ @Mock
+ private PreparedStatement preparedStatement;
+
+ /** Mock result set. */
+ @Mock
+ private ResultSet resultSet;
+
+ /** Mock result set metadata. */
+ @Mock
+ private ResultSetMetaData resultSetMetaData;
+
+ /**
+ * Sets up the helper objects and the test.
+ */
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ summary = new SummaryHelper();
+ criteria = new Criteria();
+
+ // set up database map
+ DatabaseMap databaseMap = Torque.getDatabaseMap("postgresql");
+ tableMap = databaseMap.addTable("TABLE");
+ {
+ columnMap1 = new ColumnMap("COLUMN1", tableMap);
+ columnMap1.setType(new String(""));
+ columnMap1.setJavaType("String");
+ tableMap.addColumn(columnMap1);
+ }
+ {
+ columnMap2 = new ColumnMap("COLUMN2", tableMap);
+ columnMap2.setType(new String(""));
+ columnMap2.setJavaType("String");
+ tableMap.addColumn(columnMap2);
+ }
+ {
+ columnMap3 = new ColumnMap("COLUMN3", tableMap);
+ columnMap3.setType(new String(""));
+ columnMap3.setJavaType("String");
+ tableMap.addColumn(columnMap3);
+ }
+ {
+ columnMap4 = new ColumnMap("COLUMN4", tableMap);
+ columnMap4.setType(new Integer(0));
+ columnMap4.setJavaType("Integer");
+ tableMap.addColumn(columnMap4);
+ }
+
+ // set up mocks
+ MockitoAnnotations.initMocks(this);
+ when(connection.prepareStatement((String) any()))
+ .thenReturn(preparedStatement);
+ when(connection.createStatement()).thenReturn(preparedStatement);
+ when(preparedStatement.executeQuery()).thenReturn(resultSet);
+ when(preparedStatement.executeQuery((String)
any())).thenReturn(resultSet);
+ when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
+
+ }
+
+ /**
+ * Test basic where condition on a string.
+ */
+ public void testWhereString() throws Exception
+ {
+ // prepare
+ criteria.where(columnMap1, "abc");
+ when(resultSet.next()).thenReturn(true, false);
+ when(resultSet.getObject(1)).thenReturn(23);
+ when(resultSetMetaData.getColumnCount()).thenReturn(1);
+
+
+ // execute
+ summary.addAggregate("count", new Count(columnMap1));
+ List<ListOrderedMapCI> results = summary.summarize(criteria,
connection);
+
+ // Verify result
+ assertEquals(1, results.size());
+ assertEquals(23, results.get(0).get("count"));
+
+ // verify mock (verification order not relevant)
+ verify(connection).prepareStatement(
+ "SELECT COUNT(TABLE.COLUMN1) AS count "
+ + "FROM TABLE WHERE TABLE.COLUMN1=?");
+ verify(preparedStatement).executeQuery();
+ verify(preparedStatement).setString(1, "abc");
+ verify(preparedStatement).close();
+ verify(resultSet, times(2)).next();
+ verify(resultSet).getMetaData();
+ verify(resultSet).getObject(1);
+ verify(resultSet).close();
+ verify(resultSetMetaData).getColumnCount();
+ verifyNoMoreInteractions(connection, preparedStatement, resultSet,
resultSetMetaData);
+ }
+
+}
Modified:
db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/SummaryHelperTest.java
URL:
http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/SummaryHelperTest.java?rev=1495892&r1=1495891&r2=1495892&view=diff
==============================================================================
---
db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/SummaryHelperTest.java
(original)
+++
db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/SummaryHelperTest.java
Sun Jun 23 21:14:56 2013
@@ -78,18 +78,6 @@ public class SummaryHelperTest extends B
}
}
- @Override
- public void tearDown() throws Exception
- {
- // Delete the test data
-/*
- criteria = new Criteria();
- criteria.add( Summarize1Peer.ID, -99, SqlEnum.GREATER_THAN);
- Summarize1Peer.doDelete(criteria);
- criteria = null;
-*/
- }
-
/*
* Test a simple single table with group bys
*/
@@ -176,6 +164,7 @@ public class SummaryHelperTest extends B
((Float) rec.get("SUM_FLOAT1")).floatValue() == 44.0f );
}
+
/*
* Test a total table aggregate summaries (no group bys)
*/
@@ -250,4 +239,68 @@ public class SummaryHelperTest extends B
((Float) rec.get("SUM_FLOAT1")).floatValue() == 128.0f );
}
+ /*
+ * Test a summary using a select statement
+ */
+ public void testSummarizeWithSelect() throws Exception {
+ Criteria c = new Criteria();
+ c.where(Summarize1Peer.GROUP_BY1, TEST_GROUPBY1[0]);
+
+ SummaryHelper summary = new SummaryHelper();
+
+ summary.setExcludeExprColumns(true);
+ List<Class<?>> returnTypes = new ArrayList<Class<?>>();
+
+ summary.addAggregate("COUNT_RECS", new Count(Summarize1Peer.ID));
+ returnTypes.add(Integer.class);
+
+ summary.addAggregate("AVG_INT1", new Avg(Summarize1Peer.INT_1));
+ returnTypes.add(Integer.class);
+
+ summary.addAggregate("MIN_INT1", new Min(Summarize1Peer.INT_1));
+ returnTypes.add(Integer.class);
+
+ summary.addAggregate("MAX_INT1", new Max(Summarize1Peer.INT_1));
+ returnTypes.add(Integer.class);
+
+ summary.addAggregate("SUM_INT1", new Sum(Summarize1Peer.INT_1));
+ returnTypes.add(Integer.class);
+
+ summary.addAggregate("AVG_FLOAT1", new Avg(Summarize1Peer.FLOAT1));
+ returnTypes.add(Float.class);
+
+ summary.addAggregate("MIN_FLOAT1", new Min(Summarize1Peer.FLOAT1));
+ returnTypes.add(Float.class);
+
+ summary.addAggregate("MAX_FLOAT1", new Max(Summarize1Peer.FLOAT1));
+ returnTypes.add(Float.class);
+
+ summary.addAggregate("SUM_FLOAT1", new Sum(Summarize1Peer.FLOAT1));
+ returnTypes.add(Float.class);
+
+ List<ListOrderedMapCI> results = summary.summarize(c, returnTypes);
+
+ StringWriter out = new StringWriter();
+ summary.dumpResults(out, results, true);
+ out.close();
+ logger.debug("\n"+out.toString());
+
+ assertTrue("No results returned", results.size() > 0 );
+ assertTrue("Invalid number of records returned. Expected 1 but got " +
+ results.size(), results.size() == 1 );
+
+ ListOrderedMapCI rec = results.get(0);
+
+ assertTrue("COUNT_RECS not correct value",
+ ((Integer) rec.get("COUNT_RECS")).intValue() == 4 );
+ assertTrue("AVG_INT1 not correct value",
+ ((Integer) rec.get("AVG_INT1")).intValue() == 2 );
+ assertTrue("MIN_INT1 not correct value",
+ ((Integer) rec.get("MIN_INT1")).intValue() == 1 );
+ assertTrue("MAX_INT1 not correct value",
+ ((Integer) rec.get("MAX_INT1")).intValue() == 4 );
+ assertTrue("SUM_INT1 not correct value",
+ ((Integer) rec.get("SUM_INT1")).intValue() == 10 );
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]