Search in sources :

Example 41 with Member

use of mondrian.olap.Member in project mondrian by pentaho.

the class CompoundPredicateInfo method makeUnaryPredicate.

private StarPredicate makeUnaryPredicate(RolapCubeMember member, RolapCube baseCube, Evaluator evaluator) {
    TupleConstraintStruct constraint = new TupleConstraintStruct();
    SqlConstraintUtils.expandSupportedCalculatedMember(member, evaluator, constraint);
    List<Member> expandedMemberList = constraint.getMembers();
    for (Member checkMember : expandedMemberList) {
        if (checkMember == null || checkMember.isCalculated() || !(checkMember instanceof RolapCubeMember)) {
            throw MondrianResource.instance().UnsupportedCalculatedMember.ex(member.getName(), null);
        }
    }
    List<StarPredicate> predicates = new ArrayList<StarPredicate>(expandedMemberList.size());
    for (Member iMember : expandedMemberList) {
        RolapCubeMember iCubeMember = ((RolapCubeMember) iMember);
        RolapCubeLevel iLevel = iCubeMember.getLevel();
        RolapStar.Column iColumn = iLevel.getBaseStarKeyColumn(baseCube);
        Object iKey = iCubeMember.getKey();
        StarPredicate iPredicate = new ValueColumnPredicate(iColumn, iKey);
        predicates.add(iPredicate);
    }
    StarPredicate r = null;
    if (predicates.size() == 1) {
        r = predicates.get(0);
    } else {
        r = new OrPredicate(predicates);
    }
    return r;
}
Also used : ArrayList(java.util.ArrayList) ValueColumnPredicate(mondrian.rolap.agg.ValueColumnPredicate) OrPredicate(mondrian.rolap.agg.OrPredicate) Member(mondrian.olap.Member)

Example 42 with Member

use of mondrian.olap.Member in project mondrian by pentaho.

the class RolapUtil method constraintBitkeyForLimitedMembers.

/**
 * Modifies a bitkey so that it includes the proper bits
 * for members in an array which should be considered
 * as a limited rollup member.
 */
public static void constraintBitkeyForLimitedMembers(Evaluator evaluator, Member[] members, RolapCube cube, BitKey levelBitKey) {
    // so that we can pick the correct agg table.
    for (Member curMember : members) {
        if (curMember instanceof LimitedRollupMember) {
            final int savepoint = evaluator.savepoint();
            try {
                // set NonEmpty to false to avoid the possibility of
                // constraining member retrieval by context, which itself
                // requires determination of limited members, resulting
                // in infinite loop.
                evaluator.setNonEmpty(false);
                List<Member> lowestMembers = ((RolapHierarchy) curMember.getHierarchy()).getLowestMembersForAccess(evaluator, ((LimitedRollupMember) curMember).hierarchyAccess, FunUtil.getNonEmptyMemberChildrenWithDetails(evaluator, curMember));
                assert lowestMembers.size() > 0;
                Member lowMember = lowestMembers.get(0);
                while (true) {
                    RolapStar.Column curColumn = ((RolapCubeLevel) lowMember.getLevel()).getBaseStarKeyColumn(cube);
                    if (curColumn != null) {
                        levelBitKey.set(curColumn.getBitPosition());
                    }
                    // or all of them are added.
                    if (!((RolapCubeLevel) lowMember.getLevel()).isUnique()) {
                        lowMember = lowMember.getParentMember();
                        if (lowMember.isAll()) {
                            break;
                        }
                    } else {
                        break;
                    }
                }
            } finally {
                evaluator.restore(savepoint);
            }
        }
    }
}
Also used : Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember)

Example 43 with Member

use of mondrian.olap.Member in project mondrian by pentaho.

the class RolapUtil method findBestMemberMatch.

/**
 * Locates a member specified by its member name, from an array of
 * members.  If an exact match isn't found, but a matchType of BEFORE
 * or AFTER is specified, then the closest matching member is returned.
 *
 * @param members array of members to search from
 * @param parent parent member corresponding to the member being searched
 * for
 * @param level level of the member
 * @param searchName member name
 * @param matchType match type
 * @return matching member (if it exists) or the closest matching one
 * in the case of a BEFORE or AFTER search
 */
public static Member findBestMemberMatch(List<? extends Member> members, RolapMember parent, RolapLevel level, Id.Segment searchName, MatchType matchType) {
    if (!(searchName instanceof Id.NameSegment)) {
        return null;
    }
    final Id.NameSegment nameSegment = (Id.NameSegment) searchName;
    switch(matchType) {
        case FIRST:
            return members.get(0);
        case LAST:
            return members.get(members.size() - 1);
        default:
    }
    // create a member corresponding to the member we're trying
    // to locate so we can use it to hierarchically compare against
    // the members array
    Member searchMember = level.getHierarchy().createMember(parent, level, nameSegment.name, null);
    Member bestMatch = null;
    for (Member member : members) {
        int rc;
        if (searchName.quoting == Id.Quoting.KEY && member instanceof RolapMember) {
            if (((RolapMember) member).getKey().toString().equals(nameSegment.name)) {
                return member;
            }
        }
        if (matchType.isExact()) {
            rc = Util.compareName(member.getName(), nameSegment.name);
        } else {
            rc = FunUtil.compareSiblingMembers(member, searchMember);
        }
        if (rc == 0) {
            return member;
        }
        if (matchType == MatchType.BEFORE) {
            if (rc < 0 && (bestMatch == null || FunUtil.compareSiblingMembers(member, bestMatch) > 0)) {
                bestMatch = member;
            }
        } else if (matchType == MatchType.AFTER) {
            if (rc > 0 && (bestMatch == null || FunUtil.compareSiblingMembers(member, bestMatch) < 0)) {
                bestMatch = member;
            }
        }
    }
    if (matchType.isExact()) {
        return null;
    }
    return bestMatch;
}
Also used : Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember)

Example 44 with Member

use of mondrian.olap.Member in project mondrian by pentaho.

the class SqlConstraintUtils method hasMultipleLevelSlicer.

public static boolean hasMultipleLevelSlicer(Evaluator evaluator) {
    Map<Dimension, Level> levels = new HashMap<Dimension, Level>();
    List<Member> slicerMembers = expandSupportedCalculatedMembers(((RolapEvaluator) evaluator).getSlicerMembers(), evaluator).getMembers();
    for (Member member : slicerMembers) {
        if (member.isAll()) {
            continue;
        }
        Level before = levels.put(member.getDimension(), member.getLevel());
        if (before != null && !before.equals(member.getLevel())) {
            return true;
        }
    }
    return false;
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Level(mondrian.olap.Level) Dimension(mondrian.olap.Dimension) Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)

Example 45 with Member

use of mondrian.olap.Member in project mondrian by pentaho.

the class SqlConstraintUtils method hasMultiPositionSlicer.

public static boolean hasMultiPositionSlicer(List<Member> slicerMembers) {
    Map<Hierarchy, Member> mapOfSlicerMembers = new HashMap<Hierarchy, Member>();
    for (Member slicerMember : slicerMembers) {
        Hierarchy hierarchy = slicerMember.getHierarchy();
        if (mapOfSlicerMembers.containsKey(hierarchy)) {
            // We have found a second member in this hierarchy
            return true;
        }
        mapOfSlicerMembers.put(hierarchy, slicerMember);
    }
    return false;
}
Also used : Hierarchy(mondrian.olap.Hierarchy) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)

Aggregations

Member (mondrian.olap.Member)60 ArrayList (java.util.ArrayList)20 TestMember (mondrian.olap.fun.TestMember)20 List (java.util.List)15 LimitedRollupMember (mondrian.rolap.RolapHierarchy.LimitedRollupMember)13 Evaluator (mondrian.olap.Evaluator)11 MultiCardinalityDefaultMember (mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)11 SetEvaluator (mondrian.olap.Evaluator.SetEvaluator)8 Hierarchy (mondrian.olap.Hierarchy)8 TupleList (mondrian.calc.TupleList)7 Axis (mondrian.olap.Axis)7 Exp (mondrian.olap.Exp)7 Level (mondrian.olap.Level)7 HashMap (java.util.HashMap)6 LinkedHashMap (java.util.LinkedHashMap)6 HashSet (java.util.HashSet)5 UnaryTupleList (mondrian.calc.impl.UnaryTupleList)5 MemberExpr (mondrian.mdx.MemberExpr)5 LinkedHashSet (java.util.LinkedHashSet)4 ResolvedFunCall (mondrian.mdx.ResolvedFunCall)4