/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed 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. */ package org.seasar.extension.jdbc.query; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.persistence.NoResultException; import junit.framework.TestCase; import org.seasar.extension.jdbc.DbmsDialect; import org.seasar.extension.jdbc.IterationCallback; import org.seasar.extension.jdbc.IterationContext; import org.seasar.extension.jdbc.JdbcContext; import org.seasar.extension.jdbc.ResultSetHandler; import org.seasar.extension.jdbc.SqlLogRegistry; import org.seasar.extension.jdbc.SqlLogRegistryLocator; import org.seasar.extension.jdbc.StatementHandler; import org.seasar.extension.jdbc.dialect.Db2Dialect; import org.seasar.extension.jdbc.dialect.MysqlDialect; import org.seasar.extension.jdbc.dialect.PostgreDialect; import org.seasar.extension.jdbc.dialect.StandardDialect; import org.seasar.extension.jdbc.dto.AaaDto; import org.seasar.extension.jdbc.entity.Aaa; import org.seasar.extension.jdbc.handler.BeanIterationResultSetHandler; import org.seasar.extension.jdbc.handler.BeanListResultSetHandler; import org.seasar.extension.jdbc.handler.BeanResultSetHandler; import org.seasar.extension.jdbc.manager.JdbcContextImpl; import org.seasar.extension.jdbc.manager.JdbcManagerImpl; import org.seasar.extension.jdbc.manager.JdbcManagerImplementor; import org.seasar.extension.jta.TransactionManagerImpl; import org.seasar.extension.jta.TransactionSynchronizationRegistryImpl; import org.seasar.framework.convention.impl.PersistenceConventionImpl; import org.seasar.framework.exception.SQLRuntimeException; import org.seasar.framework.mock.sql.MockColumnMetaData; import org.seasar.framework.mock.sql.MockDataSource; import org.seasar.framework.mock.sql.MockPreparedStatement; import org.seasar.framework.mock.sql.MockResultSet; import org.seasar.framework.mock.sql.MockResultSetMetaData; import org.seasar.framework.util.ArrayMap; /** * @author higa * */ public class AbsSelectTest extends TestCase { private JdbcManagerImpl manager; private JdbcContextImpl jdbcContext; @Override protected void setUp() throws Exception { manager = new JdbcManagerImpl() { @Override public JdbcContext getJdbcContext() { jdbcContext = (JdbcContextImpl) super.getJdbcContext(); return jdbcContext; } }; manager.setSyncRegistry(new TransactionSynchronizationRegistryImpl( new TransactionManagerImpl())); manager.setDataSource(new MockDataSource()); manager.setDialect(new StandardDialect()); manager.setPersistenceConvention(new PersistenceConventionImpl()); } @Override protected void tearDown() throws Exception { SqlLogRegistry regisry = SqlLogRegistryLocator.getInstance(); regisry.clear(); } /** * @throws Exception * */ public void testMaxRows() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertSame(query, query.maxRows(100)); assertEquals(100, query.maxRows); } /** * @throws Exception * */ public void testFetchSize() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertSame(query, query.fetchSize(10)); assertEquals(10, query.fetchSize); } /** * @throws Exception * */ public void testLimit() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertSame(query, query.limit(9)); assertEquals(9, query.limit); } /** * @throws Exception * */ public void testOffset() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertSame(query, query.offset(8)); assertEquals(8, query.offset); } /** * @throws Exception * */ public void testDisallowNoResult() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertSame(query, query.disallowNoResult()); assertTrue(query.disallowNoResult); } /** * @throws Exception * */ public void testSetupPreparedStatement() throws Exception { String sql = "select * from aaa where id = ?"; MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.fetchSize = 10; query.maxRows = 20; query.queryTimeout = 30; query.executedSql = sql; query.addParam("aaa"); MockPreparedStatement ps = new MockPreparedStatement(null, sql); query.setupPreparedStatement(ps); assertEquals(ResultSet.TYPE_FORWARD_ONLY, ps.getResultSetType()); assertEquals(10, ps.getFetchSize()); assertEquals(20, ps.getMaxRows()); assertEquals(30, ps.getQueryTimeout()); } /** * @throws Exception * */ public void testGetPreparedStatement() throws Exception { String sql = "select * from aaa where id = ?"; MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.fetchSize = 10; query.maxRows = 20; query.queryTimeout = 30; query.executedSql = sql; JdbcContext jdbcContext = manager.getJdbcContext(); query.processPreparedStatement(jdbcContext, new StatementHandler<Object, PreparedStatement>() { public Object handle(PreparedStatement ps) { try { assertNotNull(ps); assertEquals(ResultSet.TYPE_FORWARD_ONLY, ps .getResultSetType()); assertEquals(10, ps.getFetchSize()); assertEquals(20, ps.getMaxRows()); assertEquals(30, ps.getQueryTimeout()); } catch (SQLException e) { throw new SQLRuntimeException(e); } return null; } }); } /** * @throws Exception * */ public void testGetCursorPreparedStatement() throws Exception { String sql = "select * from aaa where id = ?"; MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.fetchSize = 10; query.maxRows = 20; query.queryTimeout = 30; query.executedSql = sql; JdbcContext jdbcContext = manager.getJdbcContext(); query.processCursorPreparedStatement(jdbcContext, new StatementHandler<Object, PreparedStatement>() { public Object handle(PreparedStatement ps) { try { assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, ps .getResultSetType()); assertEquals(10, ps.getFetchSize()); assertEquals(20, ps.getMaxRows()); assertEquals(30, ps.getQueryTimeout()); } catch (SQLException e) { throw new SQLRuntimeException(e); } return null; } }); } /** * @throws Exception * */ public void testCreateResultSet_noPaging() throws Exception { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); JdbcContext jdbcContext = manager.getJdbcContext(); query.processResultSet(jdbcContext, new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType()); assertEquals(0, rs.getRow()); return null; } }); } /** * @throws Exception * */ public void testCreateResultSet_limit_supportOffset() throws Exception { manager.setDialect(new PostgreDialect()); MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.offset = 5; query.limit = 10; JdbcContext jdbcContext = manager.getJdbcContext(); query.processResultSet(jdbcContext, new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType()); assertEquals(0, rs.getRow()); return null; } }); } /** * @throws Exception * */ public void testCreateResultSet_limit_supportOffset_offsetOnly() throws Exception { manager.setDialect(new PostgreDialect()); MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.offset = 5; JdbcContext jdbcContext = manager.getJdbcContext(); query.processResultSet(jdbcContext, new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType()); assertEquals(0, rs.getRow()); return null; } }); } /** * @throws Exception * */ public void testCreateResultSet_limit_supportOffset_offsetOnly_notSupportOffsetWithoutLimit() throws Exception { manager.setDialect(new MysqlDialect()); final MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class) { MockResultSet rs = new MockResultSet(); @Override protected Object processCursorPreparedStatement( final JdbcContext jdbcContext, final StatementHandler<Object, PreparedStatement> handler) { MockPreparedStatement ps = new MockPreparedStatement(null, null) { @Override public ResultSet executeQuery() throws SQLException { rs.addRowData(new ArrayMap()); rs.addRowData(new ArrayMap()); rs.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); return rs; } }; try { rs.setFetchSize(fetchSize); } catch (SQLException e) { e.printStackTrace(); } return handler.handle(ps); } }; query.offset = 1; JdbcContext jdbcContext = manager.getJdbcContext(); query.processResultSet(jdbcContext, new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, rs.getType()); assertEquals(1, rs.getRow()); return null; } }); } /** * @throws Exception * */ public void testCreateResultSet_notSupportOffset_cursorSupport() throws Exception { final MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class) { MockResultSet rs = new MockResultSet(); @Override protected Object processCursorPreparedStatement( final JdbcContext jdbcContext, final StatementHandler<Object, PreparedStatement> handler) { MockPreparedStatement ps = new MockPreparedStatement(null, null) { @Override public ResultSet executeQuery() throws SQLException { rs.addRowData(new ArrayMap()); rs.addRowData(new ArrayMap()); rs.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); return rs; } }; try { rs.setFetchSize(fetchSize); } catch (SQLException e) { e.printStackTrace(); } return handler.handle(ps); } }; query.offset = 1; query.limit = 10; JdbcContext jdbcContext = manager.getJdbcContext(); query.processResultSet(jdbcContext, new ResultSetHandler() { public Object handle(ResultSet rs) throws SQLException { assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, rs.getType()); assertEquals(1, rs.getRow()); return null; } }); } /** * */ @SuppressWarnings("unchecked") public void testGetResultListInternal() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createResultListResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanListResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); ArrayMap data = new ArrayMap(); data.put("FOO2", "111"); data.put("AAA_BBB", "222"); rs.addRowData(data); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; List<AaaDto> ret = query.getResultListInternal(); assertEquals(1, ret.size()); AaaDto dto = ret.get(0); assertEquals("111", dto.foo); assertEquals("222", dto.aaaBbb); assertTrue(jdbcContext.idDestroyed()); } /** * */ @SuppressWarnings("unchecked") public void testGetResultListInternal_noResult() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createResultListResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanListResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; List<AaaDto> ret = query.getResultListInternal(); assertTrue(ret.isEmpty()); } /** * */ @SuppressWarnings("unchecked") public void testGetResultListInternal_disallowNoResult() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createResultListResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanListResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; try { query.disallowNoResult().getResultListInternal(); fail(); } catch (NoResultException expected) { } } /** * */ public void testGetSingleResultInternal() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createSingleResultResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); ArrayMap data = new ArrayMap(); data.put("FOO2", "111"); data.put("AAA_BBB", "222"); rs.addRowData(data); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; AaaDto dto = query.getSingleResultInternal(); assertEquals("111", dto.foo); assertEquals("222", dto.aaaBbb); assertTrue(jdbcContext.idDestroyed()); } /** * */ public void testGetSingleResultInternal_noResult() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createSingleResultResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; AaaDto dto = query.getSingleResultInternal(); assertNull(dto); } /** * */ public void testGetSingleResultInternal_disallowNoResult() { MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createSingleResultResultSetHandler() { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanResultSetHandler(baseClass, dialect, manager .getPersistenceConvention(), "select * from aaa"); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; try { query.disallowNoResult().getSingleResultInternal(); fail(); } catch (NoResultException expected) { } } /** * */ @SuppressWarnings("unchecked") public void testIterateInternal() { final List<AaaDto> list = new ArrayList<AaaDto>(); MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createIterateResultSetHandler( IterationCallback callback) { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanIterationResultSetHandler(baseClass, dialect, manager.getPersistenceConvention(), "select * from aaa", 0, callback); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); ArrayMap data = new ArrayMap(); data.put("FOO2", "111"); data.put("AAA_BBB", "222"); rs.addRowData(data); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; query.iterateInternal(new IterationCallback<AaaDto, Integer>() { public Integer iterate(AaaDto entity, IterationContext context) { list.add(entity); return null; } }); assertEquals(1, list.size()); AaaDto dto = list.get(0); assertEquals("111", dto.foo); assertEquals("222", dto.aaaBbb); assertTrue(jdbcContext.idDestroyed()); } /** * */ @SuppressWarnings("unchecked") public void testIterateListInternal_noResult() { final List<AaaDto> list = new ArrayList<AaaDto>(); MySelect<AaaDto> query = new MySelect<AaaDto>(manager, AaaDto.class) { @Override protected ResultSetHandler createIterateResultSetHandler( IterationCallback callback) { DbmsDialect dialect = jdbcManager.getDialect(); return new BeanIterationResultSetHandler(baseClass, dialect, manager.getPersistenceConvention(), "select * from aaa", 0, callback); } @Override protected Object processResultSet(final JdbcContext jdbcContext, final ResultSetHandler handler) { try { MockResultSetMetaData rsMeta = new MockResultSetMetaData(); MockColumnMetaData columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("FOO2"); rsMeta.addColumnMetaData(columnMeta); columnMeta = new MockColumnMetaData(); columnMeta.setColumnLabel("AAA_BBB"); rsMeta.addColumnMetaData(columnMeta); MockResultSet rs = new MockResultSet(rsMeta); return handler.handle(rs); } catch (SQLException e) { throw new SQLRuntimeException(e); } } }; query.iterateInternal(new IterationCallback<AaaDto, Integer>() { public Integer iterate(AaaDto entity, IterationContext context) { list.add(entity); return null; } }); assertTrue(list.isEmpty()); } /** * */ public void testConvertLimitSql() { manager.setDialect(new PostgreDialect()); MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.limit = 10; assertEquals("select * from aaa limit 10", query .convertLimitSql("select * from aaa")); } /** * */ public void testConvertLimitSql_limitOffsetZero_db2() { manager.setDialect(new Db2Dialect()); MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); assertEquals("select * from aaa", query .convertLimitSql("select * from aaa")); } /** * */ public void testConvertSql_supportOffsetWithoutLimit() { manager.setDialect(new PostgreDialect()); MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.offset = 5; assertEquals("select * from aaa offset 5", query .convertLimitSql("select * from aaa")); } /** * */ public void testConvertSql_notSupportLimit() { MySelect<Aaa> query = new MySelect<Aaa>(manager, Aaa.class); query.limit = 10; query.offset = 5; assertEquals("select * from aaa", query .convertLimitSql("select * from aaa")); } private static class MySelect<T> extends AbstractSelect<T, MySelect<T>> { /** * @param jdbcManager * @param baseClass * */ public MySelect(JdbcManagerImplementor jdbcManager, Class<T> baseClass) { super(jdbcManager, baseClass); } @Override protected ResultSetHandler createResultListResultSetHandler() { return null; } @Override protected ResultSetHandler createSingleResultResultSetHandler() { return null; } @Override protected ResultSetHandler createIterateResultSetHandler( IterationCallback<T, ?> callback) { return null; } @Override protected void prepare(String methodName) { } } }