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