/*
// $Id: //open/mondrian-release/3.2/src/main/mondrian/olap4j/MondrianOlap4jCell.java#2 $
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// Copyright (C) 2007-2010 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.olap4j;
import mondrian.rolap.RolapCell;
import mondrian.rolap.SqlStatement;
import org.olap4j.*;
import org.olap4j.metadata.Property;
import java.sql.ResultSet;
import java.util.*;
/**
* Implementation of {@link Cell}
* for the Mondrian OLAP engine.
*
* @author jhyde
* @version $Id: //open/mondrian-release/3.2/src/main/mondrian/olap4j/MondrianOlap4jCell.java#2 $
* @since May 24, 2007
*/
class MondrianOlap4jCell implements Cell {
private final int[] coordinates;
private final MondrianOlap4jCellSet olap4jCellSet;
private final mondrian.olap.Cell cell;
/**
* Creates a MondrianOlap4jCell.
*
* @param coordinates Coordinates
* @param olap4jCellSet Cell set
* @param cell Cell in native Mondrian representation
*/
MondrianOlap4jCell(
int[] coordinates,
MondrianOlap4jCellSet olap4jCellSet,
mondrian.olap.Cell cell)
{
assert coordinates != null;
assert olap4jCellSet != null;
assert cell != null;
this.coordinates = coordinates;
this.olap4jCellSet = olap4jCellSet;
this.cell = cell;
}
public CellSet getCellSet() {
return olap4jCellSet;
}
public int getOrdinal() {
return (Integer) cell.getPropertyValue(
mondrian.olap.Property.CELL_ORDINAL.name);
}
public List<Integer> getCoordinateList() {
ArrayList<Integer> list = new ArrayList<Integer>(coordinates.length);
for (int coordinate : coordinates) {
list.add(coordinate);
}
return list;
}
public Object getPropertyValue(Property property) {
// We assume that mondrian properties have the same name as olap4j
// properties.
return cell.getPropertyValue(property.getName());
}
public boolean isEmpty() {
// FIXME
return cell.isNull();
}
public boolean isError() {
return cell.isError();
}
public boolean isNull() {
return cell.isNull();
}
public double getDoubleValue() throws OlapException {
Object o = cell.getValue();
if (o instanceof Number) {
Number number = (Number) o;
return number.doubleValue();
}
throw olap4jCellSet.olap4jStatement.olap4jConnection.helper
.createException(this, "not a number");
}
public String getErrorText() {
Object o = cell.getValue();
if (o instanceof Throwable) {
return ((Throwable) o).getMessage();
} else {
return null;
}
}
public Object getValue() {
return cell.getValue();
}
public String getFormattedValue() {
return cell.getFormattedValue();
}
public ResultSet drillThrough() throws OlapException {
return drillThroughInternal(-1, -1);
}
/**
* Executes drill-through on this cell.
*
* <p>Not a part of the public API. Package-protected because this method
* also implements the DRILLTHROUGH statement.
*
* @param maxRowCount Maximum number of rows to retrieve, <= 0 if unlimited
* @param firstRowOrdinal Ordinal of row to skip to (1-based), or 0 to
* start from beginning
* @return Result set
* @throws OlapException on error
*/
ResultSet drillThroughInternal(
int maxRowCount,
int firstRowOrdinal) throws OlapException
{
final SqlStatement sqlStmt =
((RolapCell) cell).drillThroughInternal(
maxRowCount, firstRowOrdinal, null, false, null);
return sqlStmt.getWrappedResultSet();
}
public void setValue(
Object newValue,
AllocationPolicy allocationPolicy,
Object... allocationArgs)
{
Scenario scenario =
olap4jCellSet.olap4jStatement.olap4jConnection.getScenario();
cell.setValue(scenario, newValue, allocationPolicy, allocationArgs);
}
}
// End MondrianOlap4jCell.java