Search in sources :

Example 1 with Position

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;
}
Also used : Position(org.olap4j.Position) Member(org.olap4j.metadata.Member)

Example 2 with Position

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;
        }
    }
}
Also used : Position(org.olap4j.Position) ArrayList(java.util.ArrayList) Member(org.olap4j.metadata.Member)

Example 3 with Position

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);
}
Also used : Cube(org.olap4j.metadata.Cube) Position(org.olap4j.Position)

Example 4 with Position

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);
}
Also used : Position(org.olap4j.Position) ArrayList(java.util.ArrayList) Member(org.olap4j.metadata.Member) Cell(org.olap4j.Cell)

Aggregations

Position (org.olap4j.Position)4 Member (org.olap4j.metadata.Member)3 ArrayList (java.util.ArrayList)2 Cell (org.olap4j.Cell)1 Cube (org.olap4j.metadata.Cube)1