/* * 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; } }