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;
}
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;
}
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;
}
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;
}
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;
}
Aggregations