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]

Reply via email to