/*
* Copyright 2010, Andrew M Gibson
*
* www.andygibson.net
*
* This file is part of DataValve.
*
* DataValve is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DataValve is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
*
* You should have received a copy of the GNU Lesser General Public License
* along with DataValve. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.fluttercode.datavalve.provider.jdbc;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.fluttercode.datavalve.ParameterResolver;
import org.fluttercode.datavalve.dataset.ObjectDataset;
import org.fluttercode.datavalve.dataset.StatementDataset;
import org.fluttercode.datavalve.params.Parameter;
import org.fluttercode.datavalve.provider.ParameterizedDataProvider;
import org.fluttercode.datavalve.provider.StatementDataProvider;
import org.fluttercode.datavalve.provider.jdbc.AbstractJdbcDataProvider;
import org.fluttercode.datavalve.provider.jdbc.MappedJdbcQueryDataset;
import org.fluttercode.datavalve.provider.jdbc.TableRow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Andy Gibson
*
*/
public class StatementDatasetTestCase extends BaseJdbcDatasetTest<TableRow> {
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory
.getLogger(StatementDatasetTestCase.class);
private StatementDataset<TableRow> dataset;
@Override
protected void setUp() throws Exception {
super.setUp();
dataset = createDataset();
}
private StatementDataset<TableRow> createDataset() {
MappedJdbcQueryDataset result = new MappedJdbcQueryDataset(getConnection());
result.setSelectStatement("select * from TestValues order by id");
result.setCountStatement("select count(1) from TestValues");
return new StatementDataset<TableRow>(result);
}
public void testRecordCount() {
assertEquals(100, dataset.getResultCount().intValue());
}
public void testResultsFirstPage() {
dataset.setMaxRows(10);
assertEquals(100, dataset.getResultCount().intValue());
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(10, results.size());
// check values
for (int i = 0; i < 10; i++) {
assertNotNull(results.get(i));
assertEquals(i, results.get(i).getValue("VALUE"));
assertEquals(i, results.get(i).getValue("ID"));
}
}
public void testResultPages() {
dataset.setMaxRows(10);
assertEquals(100, dataset.getResultCount().intValue());
// check values
for (int p = 0; p < 10; p++) {
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(10, results.size());
for (int i = 0; i < 10; i++) {
assertNotNull(results.get(i));
int expected = i + (p * 10);
assertEquals(expected, results.get(i).getValue("VALUE"));
assertEquals(expected, results.get(i).getValue("ID"));
}
dataset.next();
}
}
public void testUnsetParameters() {
dataset.setMaxRows(10);
dataset.getProvider().setSelectStatement("select * from TestValues where id = #{id}");
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(0, results.size());
}
public void testSetParameters() {
dataset.setMaxRows(10);
dataset.getProvider().setSelectStatement("select * from TestValues where id = :id");
dataset.getProvider().addParameter("id", 4);
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals(4, results.get(0).getValue("ID"));
assertEquals(4, results.get(0).getValue("VALUE"));
}
public void testParamResolver() {
dataset.getProvider().addParameterResolver(new ParameterResolver() {
public boolean resolveParameter(ParameterizedDataProvider<? extends Object> dataset,Parameter parameter) {
if ("#{myId}".equals(parameter.getName())) {
parameter.setValue(27);
return true;
}
return false;
}
public boolean acceptParameter(String parameter) {
return parameter.startsWith("#{") && parameter.endsWith("}");
}
});
dataset.getProvider().setSelectStatement("select * from TestValues where id = #{myId}");
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals(27, results.get(0).getValue("ID"));
}
public void testParamResolverMissingValue() {
dataset.getProvider().addParameterResolver(new ParameterResolver() {
public boolean resolveParameter(ParameterizedDataProvider<? extends Object> dataset,Parameter parameter) {
if ("myId".equals(parameter.getName())) {
parameter.setValue(27);
return true;
}
return false;
}
public boolean acceptParameter(String parameter) {
return true;
}
});
dataset.getProvider().setSelectStatement("select * from TestValues where id = #{myId_unknown}");
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(0, results.size());
}
public void testInvalidColumnName() {
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(100, results.size());
try {
results.get(0).getValue("NO COLUMN, THROW EXCEPTION");
fail("Should have thrown an unknown column name");
} catch (IllegalArgumentException ex) {
// we expected this
}
}
public void testPagingPageSizePlusOne() {
// test the paging when the
dataset.getProvider().setSelectStatement("select * from TestValues where id < 21");
dataset.getProvider().setCountStatement("select count(1) from TestValues where id < 21");
assertEquals(21, dataset.getResultCount().intValue());
assertEquals(21, dataset.getResultList().size());
dataset.setMaxRows(10);
assertEquals(false, dataset.isPreviousAvailable());
assertEquals(true, dataset.isNextAvailable());
assertEquals(3, dataset.getPageCount());
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(10, results.size());
assertEquals(false, dataset.isPreviousAvailable());
assertEquals(true, dataset.isNextAvailable());
dataset.next();
results = dataset.getResultList();
assertNotNull(results);
assertEquals(10, results.size());
assertEquals(true, dataset.isPreviousAvailable());
assertEquals(true, dataset.isNextAvailable());
dataset.next();
results = dataset.getResultList();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals(true, dataset.isPreviousAvailable());
assertEquals(false, dataset.isNextAvailable());
}
public void testPagingPageSizeMinusOne() {
log.debug("Testing size minus One");
// test the paging when the
dataset.getProvider().setSelectStatement("select * from TestValues where id < 19");
dataset.getProvider().setCountStatement("select count(1) from TestValues where id < 19");
assertEquals(19, dataset.getResultCount().intValue());
assertEquals(19, dataset.getResultList().size());
dataset.setMaxRows(10);
assertEquals(2, dataset.getPageCount());
List<TableRow> results = dataset.getResultList();
assertNotNull(results);
assertEquals(10, results.size());
assertEquals(false, dataset.isPreviousAvailable());
assertEquals(true, dataset.isNextAvailable());
dataset.next();
results = dataset.getResultList();
assertNotNull(results);
assertEquals(9, results.size());
assertEquals(true, dataset.isPreviousAvailable());
assertEquals(false, dataset.isNextAvailable());
}
public void testObjectCreation() {
StatementDataProvider<TestValue> provider = new AbstractJdbcDataProvider<TestValue>(
getConnection()) {
private static final long serialVersionUID = 1L;
@Override
public TestValue createObjectFromResultSet(ResultSet resultSet)
throws SQLException {
TestValue result = new TestValue();
result.id = resultSet.getInt(1);
result.value = resultSet.getInt(2);
return result;
}
};
StatementDataset<TestValue> qry = new StatementDataset<TestValue>(provider);
qry.getProvider().setCountStatement("select count(1) from TestValues");
qry.getProvider().setSelectStatement("select * from TestValues");
qry.setMaxRows(10);
assertEquals(100, qry.getResultCount().intValue());
assertEquals(true, qry.isNextAvailable());
assertEquals(false, qry.isPreviousAvailable());
List<TestValue> results = qry.getResultList();
assertEquals(10, results.size());
for (int p = 0; p < 10; p++) {
results = qry.getResultList();
for (int i = 0; i < 10; i++) {
TestValue val = results.get(i);
int expected = (p * 10) + i;
assertEquals(expected, val.id);
assertEquals(expected, val.value);
}
qry.next();
}
}
@Override
public ObjectDataset<TableRow> buildObjectDataset() {
return dataset;
}
}