Skip to content

Commit

Permalink
* Hierachize .Members function
Browse files Browse the repository at this point in the history
* Include calculated members defined in a query for .AllMembers function
* AddCalculatedMembers(<Set>) function

[git-p4: depot-paths = "//open/mondrian/": change = 4277]
  • Loading branch information
Sherman Wood committed Oct 27, 2005
1 parent 68140b7 commit 8f891aa
Show file tree
Hide file tree
Showing 8 changed files with 180 additions and 13 deletions.
8 changes: 8 additions & 0 deletions src/main/mondrian/olap/DelegatingSchemaReader.java
Expand Up @@ -131,6 +131,14 @@ public List getCalculatedMembers(Hierarchy hierarchy) {
return schemaReader.getCalculatedMembers(hierarchy);
}

public List getCalculatedMembers(Level level) {
return schemaReader.getCalculatedMembers(level);
}

public List getCalculatedMembers() {
return schemaReader.getCalculatedMembers();
}

public int getChildrenCountFromCache(Member member) {
return schemaReader.getChildrenCountFromCache(member);
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/mondrian/olap/Evaluator.java
Expand Up @@ -27,6 +27,11 @@ public interface Evaluator {
*/
Cube getCube();

/**
* Returns the current query.
*/
Query getQuery();

/**
* Creates a new evaluator with each given member overriding the state of
* the current validator for its dimension. Other dimensions retain the
Expand Down
24 changes: 22 additions & 2 deletions src/main/mondrian/olap/Query.java
Expand Up @@ -715,7 +715,7 @@ public void renameFormula(String uniqueName, String newName) {
List getDefinedMembers() {
List definedMembers = new ArrayList();
for (int i = 0; i < formulas.length; i++) {
if (formulas[i].isMember() && formulas[i].getElement() != null) {
if (formulas[i].isMember() && formulas[i].getElement() != null && getConnection().getRole().canAccess(formulas[i].getElement())) {
definedMembers.add(formulas[i].getElement());
}
}
Expand Down Expand Up @@ -1034,7 +1034,11 @@ public Member getMemberByUniqueName(
member = schemaReader.getMemberByUniqueName(uniqueNameParts,
failIfNotFound);
}
return member;
if (getRole().canAccess(member)) {
return member;
} else {
return null;
}
}

public Member getCalculatedMember(String[] nameParts) {
Expand All @@ -1054,6 +1058,22 @@ public List getCalculatedMembers(Hierarchy hierarchy) {
return result;
}

public List getCalculatedMembers(Level level) {
List hierachyMembers = getCalculatedMembers(level.getHierarchy());
List result = new ArrayList();
for (int i = 0; i < hierachyMembers.size(); i++) {
Member member = (Member) hierachyMembers.get(i);
if (member.getLevel().equals(level)) {
result.add(member);
}
}
return result;
}

public List getCalculatedMembers() {
return getDefinedMembers();
}

public OlapElement getElementChild(OlapElement parent, String s) {
// first look in cube
OlapElement mdxElement = schemaReader.getElementChild(parent, s);
Expand Down
10 changes: 10 additions & 0 deletions src/main/mondrian/olap/SchemaReader.java
Expand Up @@ -229,6 +229,16 @@ OlapElement lookupCompound(
* Returns a list of calculated members in a given hierarchy.
*/
List getCalculatedMembers(Hierarchy hierarchy);

/**
* Returns a list of calculated members in a given level.
*/
List getCalculatedMembers(Level level);

/**
* Returns the list of calculated members.
*/
List getCalculatedMembers();
}

// End SchemaReader.java
79 changes: 74 additions & 5 deletions src/main/mondrian/olap/fun/BuiltinFunTable.java
Expand Up @@ -1186,11 +1186,67 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {

//
// SET FUNCTIONS
if (false) define(new FunDefBase(

/*
* AddCalculatedMembers adds calculated members that are siblings
* of the members in the set. The set is limited to one dimension.
*/
define(new FunDefBase(
"AddCalculatedMembers",
"AddCalculatedMembers(<Set>)",
"Adds calculated members to a set.",
"fx*"));
"fxx") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
List memberList = (List) getArg(evaluator, args, 0);
if (memberList != null) {
/*
* Determine unique levels in the set
*/
Map levelMap = new HashMap();

Dimension dim = null;

Iterator it = memberList.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (!(obj instanceof Member)) {
throw newEvalException(this, "Only single dimension members allowed in set for AddCalculatedMembers");
}
Member member = (Member) obj;
if (dim == null) {
dim = member.getDimension();
} else if (dim != member.getDimension()) {
throw newEvalException(this, "Only members from the same dimension are allowed in the AddCalculatedMembers set: "
+ dim.toString() + " vs " + member.getDimension().toString());
}
if (!levelMap.containsKey(member.getLevel())) {
levelMap.put(member.getLevel(), null);
}
}
/*
* For each level, add the calculated members from both
* the schema and the query
*/
List workingList = new ArrayList();
workingList.addAll(memberList);
it = levelMap.keySet().iterator();
while (it.hasNext()) {
Level level = (Level) it.next();
List tmp = evaluator.getSchemaReader().getCalculatedMembers(level);
if (tmp != null) {
workingList.addAll(tmp);
}
tmp = evaluator.getQuery().getSchemaReader(true).getCalculatedMembers(level);
if (tmp != null) {
workingList.addAll(tmp);
}
}
memberList = workingList;

}
return memberList;
}
});

define(new FunDefBase(
"Ascendants",
Expand Down Expand Up @@ -1628,6 +1684,7 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
if (memberList != null) {
removeCalculatedMembers(memberList);
}
hierarchize(memberList, false);
return memberList;
}
});
Expand All @@ -1640,7 +1697,11 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Dimension dimension = (Dimension) getArg(evaluator, args, 0);
Hierarchy hierarchy = dimension.getHierarchy();
return addMembers(evaluator.getSchemaReader(), new ArrayList(), hierarchy);
List result = addMembers(evaluator.getSchemaReader(),
new ArrayList(), hierarchy);
hierarchize(result, false);
result.addAll(evaluator.getQuery().getSchemaReader(true).getCalculatedMembers(hierarchy));
return result;
}
});

Expand All @@ -1656,6 +1717,7 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
if (memberList != null) {
removeCalculatedMembers(memberList);
}
hierarchize(memberList, false);
return memberList;
}
});
Expand All @@ -1667,8 +1729,11 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
"pxh") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Hierarchy hierarchy = (Hierarchy) getArg(evaluator, args, 0);
return addMembers(evaluator.getSchemaReader(),
List result = addMembers(evaluator.getSchemaReader(),
new ArrayList(), hierarchy);
hierarchize(result, false);
result.addAll(evaluator.getQuery().getSchemaReader(true).getCalculatedMembers(hierarchy));
return result;
}
});

Expand All @@ -1684,6 +1749,7 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
if (memberList != null) {
removeCalculatedMembers(memberList);
}
hierarchize(memberList, false);
return memberList;
}
});
Expand All @@ -1696,7 +1762,10 @@ public Object evaluate(Evaluator evaluator, Exp[] args) {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Level level = (Level) getArg(evaluator, args, 0);
Member[] members = evaluator.getSchemaReader().getLevelMembers(level);
return new ArrayList(Arrays.asList(members));
List memberList = new ArrayList(Arrays.asList(members));
hierarchize(memberList, false);
memberList.addAll(evaluator.getQuery().getSchemaReader(true).getCalculatedMembers(level));
return memberList;
}
});

Expand Down
55 changes: 49 additions & 6 deletions src/main/mondrian/rolap/RolapCube.java
Expand Up @@ -1830,7 +1830,7 @@ public Member getCalculatedMember(String[] nameParts) {
Formula formula = calculatedMembers[i];
final String formulaUniqueName =
formula.getMdxMember().getUniqueName();
if (formulaUniqueName.equals(uniqueName)) {
if (formulaUniqueName.equals(uniqueName) && getRole().canAccess(formula.getMdxMember())) {
return formula.getMdxMember();
}
}
Expand All @@ -1852,20 +1852,63 @@ public NamedSet getNamedSet(String[] nameParts) {

public List getCalculatedMembers(Hierarchy hierarchy) {
ArrayList list = new ArrayList();

if (getRole().getAccess(hierarchy) == Access.NONE) {
return list;
}

for (int i = 0; i < calculatedMembers.length; i++) {
Formula formula = calculatedMembers[i];
Member member = formula.getMdxMember();
if (member.getHierarchy().equals(hierarchy) && getRole().canAccess(member)) {
list.add(member);
}
}
return list;
}

public List getCalculatedMembers(Level level) {
ArrayList list = new ArrayList();

if (getRole().getAccess(level) == Access.NONE) {
return list;
}

List hierarchyList = getCalculatedMembers(level.getHierarchy());

Iterator it = hierarchyList.iterator();

while (it.hasNext()) {
Member member = (Member) it.next();
if (member.getLevel().equals(level) && getRole().canAccess(member)) {
list.add(member);
}
}
return list;
}

public List getCalculatedMembers() {
ArrayList list = new ArrayList();
for (int i = 0; i < calculatedMembers.length; i++) {
Formula formula = calculatedMembers[i];
if (formula.getMdxMember().getHierarchy().equals(hierarchy)) {
list.add(formula.getMdxMember());
Member member = formula.getMdxMember();
if (getRole().canAccess(member)) {
list.add(member);
}
}
return list;
}

public Member getMemberByUniqueName(
String[] uniqueNameParts, boolean failIfNotFound) {
return (Member) lookupCompound(
RolapCube.this, uniqueNameParts,
failIfNotFound, Category.Member);
Member member = (Member) lookupCompound(
RolapCube.this, uniqueNameParts,
failIfNotFound, Category.Member);
if (getRole().canAccess(member)) {
return member;
} else {
return null;
}
}

public Cube getCube() {
Expand Down
4 changes: 4 additions & 0 deletions src/main/mondrian/rolap/RolapEvaluator.java
Expand Up @@ -134,6 +134,10 @@ public Cube getCube() {
return root.cube;
}

public Query getQuery() {
return root.result.getQuery();
}

public int getDepth() {
return depth;
}
Expand Down
8 changes: 8 additions & 0 deletions src/main/mondrian/rolap/RolapSchemaReader.java
Expand Up @@ -309,6 +309,14 @@ public Cube[] getCubes() {
public List getCalculatedMembers(Hierarchy hierarchy) {
return Collections.EMPTY_LIST;
}

public List getCalculatedMembers(Level level) {
return Collections.EMPTY_LIST;
}

public List getCalculatedMembers() {
return Collections.EMPTY_LIST;
}
}

// End RolapSchemaReader.java

0 comments on commit 8f891aa

Please sign in to comment.