Search in sources :

Example 46 with Member

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

the class SqlConstraintUtils method getUniqueOrdinalMembers.

/**
 * Gets a list of unique ordinal cube members to make sure our
 * cell request isn't unsatisfiable, following the same logic
 * as RolapEvaluator
 * @return Unique ordinal cube members
 */
protected static List<Member> getUniqueOrdinalMembers(List<Member> members) {
    ArrayList<Integer> currentOrdinals = new ArrayList<Integer>();
    ArrayList<Member> uniqueMembers = new ArrayList<Member>();
    for (Member member : members) {
        final RolapMemberBase m = (RolapMemberBase) member;
        int ordinal = m.getHierarchyOrdinal();
        if (!currentOrdinals.contains(ordinal)) {
            uniqueMembers.add(member);
            currentOrdinals.add(ordinal);
        }
    }
    return uniqueMembers;
}
Also used : ArrayList(java.util.ArrayList) Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)

Example 47 with Member

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

the class SqlConstraintUtils method expandMultiPositionSlicerMembers.

protected static Member[] expandMultiPositionSlicerMembers(Member[] members, Evaluator evaluator) {
    List<Member> slicerMembers = null;
    if (evaluator instanceof RolapEvaluator) {
        // get the slicer members from the evaluator
        slicerMembers = ((RolapEvaluator) evaluator).getSlicerMembers();
    }
    if (slicerMembers != null) {
        // Iterate the list of slicer members, grouping them by hierarchy
        Map<Hierarchy, Set<Member>> mapOfSlicerMembers = new HashMap<Hierarchy, Set<Member>>();
        for (Member slicerMember : slicerMembers) {
            Hierarchy hierarchy = slicerMember.getHierarchy();
            if (!mapOfSlicerMembers.containsKey(hierarchy)) {
                mapOfSlicerMembers.put(hierarchy, new HashSet<Member>());
            }
            mapOfSlicerMembers.get(hierarchy).add(slicerMember);
        }
        List<Member> listOfMembers = new ArrayList<Member>();
        // has multiple members on the slicer axis
        for (Member member : members) {
            Hierarchy hierarchy = member.getHierarchy();
            if (!mapOfSlicerMembers.containsKey(hierarchy) || mapOfSlicerMembers.get(hierarchy).size() < 2 || member instanceof RolapResult.CompoundSlicerRolapMember) {
                listOfMembers.add(member);
            } else {
                listOfMembers.addAll(mapOfSlicerMembers.get(hierarchy));
            }
        }
        members = listOfMembers.toArray(new Member[listOfMembers.size()]);
    }
    return members;
}
Also used : Hierarchy(mondrian.olap.Hierarchy) Set(java.util.Set) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)

Example 48 with Member

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

the class SqlConstraintUtils method anyMemberOverlaps.

/**
 * Compares the array of members against memberInMeasure, returning
 * true if any of the members are of the same hierarchy and
 * is either [All] or a equal to or a child of memberInMeasure.
 *
 * This is used to identify whether whether the memberInMeasure
 * is "overlapped" by any of the members.  For native evaluation
 * we need to make sure that a member included as a result of
 * a calculated measure does not fall outside of the set of members
 * that will be used to constrain the native query, in which case
 * we may exclude members incorrectly.
 */
private static boolean anyMemberOverlaps(Member[] members, Member memberInMeasure) {
    boolean memberIsCovered = false;
    boolean encounteredHierarchy = false;
    for (Member memberCheckedForConflict : members) {
        final boolean sameHierarchy = memberInMeasure.getHierarchy().equals(memberCheckedForConflict.getHierarchy());
        boolean childOrEqual = false;
        if (sameHierarchy) {
            encounteredHierarchy = true;
            childOrEqual = memberCheckedForConflict.isAll() || memberInMeasure.isChildOrEqualTo(memberCheckedForConflict);
        }
        if (sameHierarchy && childOrEqual) {
            memberIsCovered = true;
            break;
        }
    }
    return !encounteredHierarchy || memberIsCovered;
}
Also used : Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember)

Example 49 with Member

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

the class SqlConstraintUtils method getMembersNestedInMeasures.

public static Set<Member> getMembersNestedInMeasures(Set<Member> measures) {
    Set<Member> membersNestedInMeasures = new HashSet<>();
    for (Member m : measures) {
        if (m.isCalculated()) {
            Exp exp = m.getExpression();
            exp.accept(new MemberExtractingVisitor(membersNestedInMeasures, null, false));
        }
    }
    return membersNestedInMeasures;
}
Also used : Exp(mondrian.olap.Exp) Member(mondrian.olap.Member) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember) MemberExtractingVisitor(mondrian.olap.fun.MemberExtractingVisitor) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet)

Example 50 with Member

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

the class SqlConstraintUtils method getRoleConstraintMembers.

public static Map<Level, List<RolapMember>> getRoleConstraintMembers(SchemaReader schemaReader, Member[] members) {
    // LinkedHashMap keeps insert-order
    Map<Level, List<RolapMember>> roleMembers = new LinkedHashMap<Level, List<RolapMember>>();
    Role role = schemaReader.getRole();
    for (Member member : members) {
        if (member instanceof LimitedRollupMember || member instanceof MultiCardinalityDefaultMember) {
            // iterate relevant levels to get accessible members
            List<Level> hierarchyLevels = schemaReader.getHierarchyLevels(member.getHierarchy());
            for (Level affectedLevel : hierarchyLevels) {
                List<RolapMember> slicerMembers = new ArrayList<RolapMember>();
                boolean hasCustom = false;
                List<Member> availableMembers = schemaReader.getLevelMembers(affectedLevel, false);
                for (Member availableMember : availableMembers) {
                    if (!availableMember.isAll()) {
                        slicerMembers.add((RolapMember) availableMember);
                    }
                    hasCustom |= role.getAccess(availableMember) == Access.CUSTOM;
                }
                if (!slicerMembers.isEmpty()) {
                    roleMembers.put(affectedLevel, slicerMembers);
                }
                if (!hasCustom) {
                    // we don't have partial access, no need to go deeper
                    break;
                }
            }
        }
    }
    return roleMembers;
}
Also used : ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) LimitedRollupMember(mondrian.rolap.RolapHierarchy.LimitedRollupMember) Role(mondrian.olap.Role) MultiCardinalityDefaultMember(mondrian.rolap.RestrictedMemberReader.MultiCardinalityDefaultMember) Level(mondrian.olap.Level) List(java.util.List) FilteredIterableList(mondrian.util.FilteredIterableList) ArrayList(java.util.ArrayList) TupleList(mondrian.calc.TupleList) 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