/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright 2006 - 2009 Pentaho Corporation. All rights reserved.
*
*
* Created Dec 27, 2006
* @author mdamour
*/
package org.pentaho.platform.plugin.services.connections.hql;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.type.Type;
import org.pentaho.commons.connection.IPeekable;
import org.pentaho.commons.connection.IPentahoMetaData;
import org.pentaho.commons.connection.IPentahoResultSet;
import org.pentaho.commons.connection.memory.MemoryMetaData;
import org.pentaho.commons.connection.memory.MemoryResultSet;
import org.pentaho.platform.plugin.services.messages.Messages;
/**
* @author mdamour
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class HQLResultSet implements IPentahoResultSet, IPeekable {
private static final int COUNT_NEVER_OBTAINED = -2;
private int rowCount = HQLResultSet.COUNT_NEVER_OBTAINED;
private int columnCount = HQLResultSet.COUNT_NEVER_OBTAINED;
private static final Log log = LogFactory.getLog(HQLResultSet.class);
private IPentahoMetaData metadata;
private List nativeResultSet = null;
protected Object peekRow[];
private int index = 0;
/**
*
*/
public HQLResultSet(final List list, final String columnNames[], final Type columnTypes[]) {
super();
try {
nativeResultSet = list;
metadata = new HQLMetaData(list, this, columnNames, columnTypes);
} catch (Exception e) {
// TODO Auto-generated catch block
HQLResultSet.log.error(Messages.getInstance().getErrorString("SQLResultSet.ERROR_0004_GET_METADATA"), e); //$NON-NLS-1$
// e.printStackTrace();
throw new RuntimeException(e);
}
}
public void setMetaData(final IPentahoMetaData metadata) {
this.metadata = metadata;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.connection.IPentahoResultSet#getMetaData()
*/
public IPentahoMetaData getMetaData() {
return metadata;
}
public Object[] peek() {
if( peekRow == null ) {
peekRow = next();
}
return peekRow;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.connection.IPentahoResultSet#next() returns null if no
* more rows
*/
public Object[] next() {
if (peekRow != null) {
Object row[] = peekRow;
peekRow = null;
return row;
}
try {
if (index < nativeResultSet.size()) {
Object row = nativeResultSet.get(index++);
if (row instanceof Object[]) {
return (Object[]) row;
} else {
Object[] newRow = new Object[1];
newRow[0] = row;
return newRow;
}
}
} catch (Exception e) {
HQLResultSet.log.error(Messages.getInstance().getErrorString("SQLResultSet.ERROR_0005_NEXT"), e); //$NON-NLS-1$
}
return null;
}
public void closeConnection() {
close();
}
public void close() {
}
public void dispose() {
closeConnection();
}
public boolean isScrollable() {
return false;
}
/**
* Returns the column count from the result set.
*
* @return the column count.
*/
public int getColumnCount() {
if (columnCount != HQLResultSet.COUNT_NEVER_OBTAINED) {
// We have already calculated column count, return what we have.
return columnCount;
}
if (nativeResultSet.size() > 0) {
Object row = nativeResultSet.get(0);
if (row instanceof Object[]) {
columnCount = ((Object[]) row).length;
} else {
columnCount = 1;
}
return columnCount;
}
return 0;
}
/**
* Get a rowCount from the resultset. If the resultset
*
* @return the row count.
*/
public int getRowCount() {
if (rowCount != HQLResultSet.COUNT_NEVER_OBTAINED) {
// We have already calculated rowcount, return what we have
return rowCount;
}
rowCount = nativeResultSet.size();
return rowCount;
}
/**
* Returns the value of the specified row and the specified column from
* within the resultset.
*
* @param row
* the row index.
* @param column
* the column index.
* @return the value.
*/
public Object getValueAt(final int row, final int column) {
if (row < nativeResultSet.size()) {
Object rowObj = nativeResultSet.get(row);
if (rowObj instanceof Object[]) {
return ((Object[]) rowObj)[column];
} else {
return rowObj;
}
}
return null;
}
public IPentahoResultSet memoryCopy() {
try {
IPentahoMetaData localMetadata = getMetaData();
Object columnHeaders[][] = localMetadata.getColumnHeaders();
MemoryMetaData cachedMetaData = new MemoryMetaData(columnHeaders, null);
MemoryResultSet cachedResultSet = new MemoryResultSet(cachedMetaData);
Object[] rowObjects = next();
while (rowObjects != null) {
cachedResultSet.addRow(rowObjects);
rowObjects = next();
}
return cachedResultSet;
} finally {
close();
}
}
public void beforeFirst() {
try {
index = 0;
} catch (Exception e) {
HQLResultSet.log.error(Messages.getInstance().getErrorString("SQLResultSet.ERROR_0003_BEFORE_FIRST"), e); //$NON-NLS-1$
}
}
public Object[] getDataColumn(final int column) {
Object[] result = null;
result = new Object[getRowCount()];
for (int row = 0; row < result.length; row++) {
result[row] = getValueAt(row, column);
}
return result;
}
public Object[] getDataRow(final int row) {
Object[] rowData = new Object[this.getColumnCount()];
for (int column = 0; column < rowData.length; column++) {
rowData[column] = getValueAt(row, column);
}
return rowData;
}
}