use of org.olap4j.Position in project pentaho-kettle by pentaho.
the class CellSetFormatter method computeAxisInfo.
/**
* Computes a description of an axis.
*
* @param axis
* Axis
* @return Description of axis
*/
private AxisInfo computeAxisInfo(final CellSetAxis axis) {
if (axis == null) {
return new AxisInfo(0);
}
final AxisInfo axisInfo = new AxisInfo(axis.getAxisMetaData().getHierarchies().size());
int p = -1;
for (final Position position : axis.getPositions()) {
++p;
int k = -1;
for (final Member member : position.getMembers()) {
++k;
final AxisOrdinalInfo axisOrdinalInfo = axisInfo.ordinalInfos.get(k);
final int topDepth = member.isAll() ? member.getDepth() : member.getHierarchy().hasAll() ? 1 : 0;
if (axisOrdinalInfo.minDepth > topDepth || p == 0) {
axisOrdinalInfo.minDepth = topDepth;
}
axisOrdinalInfo.maxDepth = Math.max(axisOrdinalInfo.maxDepth, member.getDepth());
}
}
return axisInfo;
}
use of org.olap4j.Position in project pentaho-kettle by pentaho.
the class CellSetFormatter method populateAxis.
/**
* Populates cells in the matrix corresponding to a particular axis.
*
* @param matrix
* Matrix to populate
* @param axis
* Axis
* @param axisInfo
* Description of axis
* @param isColumns
* True if columns, false if rows
* @param offset
* Ordinal of first cell to populate in matrix
*/
private void populateAxis(final Matrix matrix, final CellSetAxis axis, final AxisInfo axisInfo, final boolean isColumns, final int offset) {
if (axis == null) {
return;
}
final Member[] prevMembers = new Member[axisInfo.getWidth()];
final MemberCell[] prevMemberInfo = new MemberCell[axisInfo.getWidth()];
final Member[] members = new Member[axisInfo.getWidth()];
for (int i = 0; i < axis.getPositions().size(); i++) {
final int x = offset + i;
final Position position = axis.getPositions().get(i);
int yOffset = 0;
final List<Member> memberList = position.getMembers();
for (int j = 0; j < memberList.size(); j++) {
Member member = memberList.get(j);
final AxisOrdinalInfo ordinalInfo = axisInfo.ordinalInfos.get(j);
while (member != null) {
if (member.getDepth() < ordinalInfo.minDepth) {
break;
}
final int y = yOffset + member.getDepth() - ordinalInfo.minDepth;
members[y] = member;
member = member.getParentMember();
}
yOffset += ordinalInfo.getWidth();
}
boolean same = true;
for (int y = 0; y < members.length; y++) {
final MemberCell memberInfo = new MemberCell();
final Member member = members[y];
final List<String> memberPath = new ArrayList<String>();
for (int z = 0; z <= position.getMembers().size() - 1; z++) {
if (i < axis.getPositions().size() - 1) {
if (axis.getPositions().get(i + 1).getMembers().get(z).getParentMember() != null && axis.getPositions().get(i + 1).getMembers().get(z).getParentMember().equals(member)) {
if (member == null || position.getMembers().get(z).getUniqueName().equals(member.getUniqueName())) {
break;
}
}
}
memberPath.add(position.getMembers().get(z).getUniqueName());
}
if (member != null) {
memberPath.add(member.getUniqueName());
}
memberInfo.setMemberPath(memberPath);
same = same && i > 0 && Olap4jUtil.equal(prevMembers[y], member);
if (member != null) {
if (x - 1 == offset) {
matrix.setOffset(offset);
}
memberInfo.setRawValue(member.getCaption());
// First try to get a formatted value
memberInfo.setFormattedValue(member.getCaption());
memberInfo.setParentDimension(member.getDimension().getName());
memberInfo.setUniqueName(member.getUniqueName());
if (y > 0 && prevMembers[y - 1] != null) {
memberInfo.setRightOf(prevMemberInfo[y - 1]);
}
if (y > 0 && prevMembers[y - 1] != null) {
memberInfo.setRightOfDimension(prevMembers[y - 1].getDimension().getName());
}
if (member.getParentMember() != null) {
memberInfo.setParentMember(member.getParentMember().getUniqueName());
}
} else {
memberInfo.setRawValue(null);
memberInfo.setFormattedValue(null);
memberInfo.setParentDimension(null);
}
if (isColumns) {
memberInfo.setRight(false);
memberInfo.setSameAsPrev(same);
if (member != null) {
memberInfo.setParentDimension(member.getDimension().getName());
}
matrix.set(x, y, memberInfo);
} else {
if (same) {
memberInfo.setFormattedValue(null);
memberInfo.setRawValue(null);
memberInfo.setParentDimension(null);
}
memberInfo.setRight(false);
memberInfo.setSameAsPrev(false);
matrix.set(y, x, memberInfo);
}
prevMembers[y] = member;
prevMemberInfo[y] = memberInfo;
members[y] = null;
}
}
}
use of org.olap4j.Position in project mondrian by pentaho.
the class Olap4jTest method testCalcMemberInCube.
/**
* Test case for bug <a href="http://jira.pentaho.com/browse/MONDRIAN-1123">
* MONDRIAN-1123, "ClassCastException for calculated members that are not
* part of the measures dimension"</a>.
*
* @throws java.sql.SQLException on error
*/
public void testCalcMemberInCube() throws SQLException {
final OlapConnection testContext = TestContext.instance().createSubstitutingCube("Sales", null, "<CalculatedMember name='H1 1997' formula='Aggregate([Time].[1997].[Q1]:[Time].[1997].[Q2])' dimension='Time' />").getOlap4jConnection();
final Cube cube = testContext.getOlapSchema().getCubes().get("Sales");
final List<Measure> measureList = cube.getMeasures();
StringBuilder buf = new StringBuilder();
for (Measure measure : measureList) {
buf.append(measure.getName()).append(";");
}
// Calc member in the Time dimension does not appear in the list.
// Never did, as far as I can tell.
assertEquals("Unit Sales;Store Cost;Store Sales;Sales Count;Customer Count;" + "Promotion Sales;Profit;Profit last Period;Profit Growth;", buf.toString());
final CellSet cellSet = testContext.createStatement().executeOlapQuery("select AddCalculatedMembers([Time].[Time].Members) on 0 from [Sales]");
int n = 0, n2 = 0;
for (Position position : cellSet.getAxes().get(0).getPositions()) {
if (position.getMembers().get(0).getName().equals("H1 1997")) {
++n;
}
++n2;
}
assertEquals(1, n);
assertEquals(35, n2);
final CellSet cellSet2 = testContext.createStatement().executeOlapQuery("select Filter(\n" + " AddCalculatedMembers([Time].[Time].Members),\n" + " [Time].[Time].CurrentMember.Properties('MEMBER_TYPE') = 4) on 0\n" + "from [Sales]");
n = 0;
n2 = 0;
for (Position position : cellSet2.getAxes().get(0).getPositions()) {
if (position.getMembers().get(0).getName().equals("H1 1997")) {
++n;
}
++n2;
}
assertEquals(1, n);
assertEquals(1, n2);
}
use of org.olap4j.Position in project teiid by teiid.
the class OlapQueryExecution method next.
@Override
public List<?> next() throws TranslatorException {
if (!rowPositionIterator.hasNext()) {
return null;
}
Position rowPosition = rowPositionIterator.next();
Object[] result = new Object[colWidth];
int i = 0;
// add in rows axis
List<Member> members = rowPosition.getMembers();
for (Member member : members) {
String columnName = member.getName();
result[i++] = columnName;
}
// add col axis
for (Position colPos : columnsAxis) {
Cell cell = cellSet.getCell(colPos, rowPosition);
result[i++] = cell.getValue();
}
if (returnsArray) {
ArrayList<Object[]> results = new ArrayList<Object[]>(1);
results.add(result);
return results;
}
return Arrays.asList(result);
}