/**
* Alipay.com Inc.
* Copyright (c) 2004-2012 All Rights Reserved.
*/
package com.alipay.zdal.client.jdbc.resultset;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import com.alipay.zdal.client.jdbc.ZdalStatement;
/**
*
* @author ����
* @version $Id: SumTResultSet.java, v 0.1 2014-1-6 ����05:15:05 Exp $
*/
public class SumTResultSet extends AbstractTResultSet {
private Object value;
private int cursor;
private boolean isNull;
public SumTResultSet(ZdalStatement statementProxy, List<ResultSet> resultSets)
throws SQLException {
super(statementProxy, resultSets);
}
@Override
public boolean next() throws SQLException {
if (cursor > 0) {
return false;
}
reducer();
cursor++;
return true;
}
protected ResultSet reducer() throws SQLException {
ResultSet resultSet;
Object sum = null;
Add<Object> add = null;
for (int i = 0; i < actualResultSets.size(); i++) {
resultSet = actualResultSets.get(i);
resultSet.next();
Object data = resultSet.getObject(1);
if (data != null) {
if (sum == null) {
sum = data;
if (sum instanceof Integer) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Integer) left + (Integer) right;
}
};
} else if (sum instanceof Float) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Float) left + (Float) right;
}
};
} else if (sum instanceof Long) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Long) left + (Long) right;
}
};
} else if (sum instanceof Double) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Double) left + (Double) right;
}
};
} else if (sum instanceof BigDecimal) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return ((BigDecimal) left).add((BigDecimal) right);
}
};
} else if (sum instanceof Short) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Short) left + (Short) right;
}
};
} else if (sum instanceof Byte) {
add = new Add<Object>() {
public Object add(Object left, Object right) {
return (Byte) left + (Byte) right;
}
};
} else {
throw new SQLException(
"The group function 'SUM' does not supported the type '"
+ sum.getClass() + "'");
}
} else {
sum = add.add(sum, resultSet.getObject(1));
}
}
}
this.value = sum;
this.isNull = sum == null;
return null;
}
private static interface Add<T> {
T add(T left, T right);
}
@Override
public int findColumn(String columnName) throws SQLException {
checkCursor();
if (!columnName.equals(actualResultSets.get(0).getMetaData().getColumnName(1))) {
throw new SQLException("Column '" + columnName + "' not found");
}
return 1;
}
private void checkCursor() throws SQLException {
if (cursor != 1) {
throw new SQLException();
}
}
private void checkIndex(int columnIndex) throws SQLException {
checkCursor();
if (columnIndex < 1) {
throw new SQLException("Column Index out of range, " + columnIndex + " < 1");
} else if (columnIndex > 1) {
throw new SQLException("Column Index out of range, " + columnIndex + " > 1");
}
}
@Override
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
checkIndex(columnIndex);
return (BigDecimal) value;
}
@Override
public BigDecimal getBigDecimal(String columnName) throws SQLException {
return getBigDecimal(findColumn(columnName));
}
@Override
public byte getByte(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).byteValueExact();
} else {
return (Byte) value;
}
}
@Override
public byte getByte(String columnName) throws SQLException {
return getByte(findColumn(columnName));
}
@Override
public double getDouble(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).doubleValue();
} else {
return (Double) value;
}
}
@Override
public double getDouble(String columnName) throws SQLException {
return getDouble(findColumn(columnName));
}
@Override
public float getFloat(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).floatValue();
} else {
return (Float) value;
}
}
@Override
public float getFloat(String columnName) throws SQLException {
return getFloat(findColumn(columnName));
}
@Override
public int getInt(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).intValueExact();
} else {
return (Integer) value;
}
}
@Override
public int getInt(String columnName) throws SQLException {
return getInt(findColumn(columnName));
}
@Override
public long getLong(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).longValueExact();
} else {
return (Long) value;
}
}
@Override
public long getLong(String columnName) throws SQLException {
return getLong(findColumn(columnName));
}
@Override
public Object getObject(int columnIndex) throws SQLException {
checkIndex(columnIndex);
return value;
}
@Override
public Object getObject(String columnName) throws SQLException {
return getObject(findColumn(columnName));
}
@Override
public short getShort(int columnIndex) throws SQLException {
checkIndex(columnIndex);
if (value == null) {
return 0;
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).shortValueExact();
} else {
return (Short) value;
}
}
@Override
public short getShort(String columnName) throws SQLException {
return getShort(findColumn(columnName));
}
@Override
public ResultSetMetaData getMetaData() throws SQLException {
return actualResultSets.get(0).getMetaData();
}
@Override
public boolean wasNull() throws SQLException {
return this.isNull;
}
}