/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.olap4j;
import mondrian.olap.OlapElement;
import mondrian.rolap.RolapConnection;
import mondrian.rolap.RolapMeasure;
import mondrian.server.Locus;
import org.olap4j.OlapException;
import org.olap4j.impl.AbstractNamedList;
import org.olap4j.impl.Named;
import org.olap4j.mdx.ParseTreeNode;
import org.olap4j.metadata.*;
import java.util.ArrayList;
import java.util.List;
/**
* Implementation of {@link Member}
* for the Mondrian OLAP engine,
* as a wrapper around a mondrian
* {@link mondrian.olap.Member}.
*
* @author jhyde
* @since May 25, 2007
*/
class MondrianOlap4jMember
extends MondrianOlap4jMetadataElement
implements Member, Named
{
final mondrian.olap.Member member;
final MondrianOlap4jSchema olap4jSchema;
MondrianOlap4jMember(
MondrianOlap4jSchema olap4jSchema,
mondrian.olap.Member mondrianMember)
{
assert mondrianMember != null;
assert mondrianMember instanceof RolapMeasure
== this instanceof MondrianOlap4jMeasure;
this.olap4jSchema = olap4jSchema;
this.member = mondrianMember;
}
public boolean equals(Object obj) {
return obj instanceof MondrianOlap4jMember
&& member.equals(((MondrianOlap4jMember) obj).member);
}
public int hashCode() {
return member.hashCode();
}
public String toString() {
return getUniqueName();
}
public NamedList<MondrianOlap4jMember> getChildMembers()
throws OlapException
{
final RolapConnection conn =
olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData
.olap4jConnection.getMondrianConnection();
final List<mondrian.olap.Member> children =
Locus.execute(
conn,
"MondrianOlap4jMember.getChildMembers",
new Locus.Action<List<mondrian.olap.Member>>() {
public List<mondrian.olap.Member> execute() {
return
conn.getSchemaReader()
.getMemberChildren(member);
}
});
return new AbstractNamedList<MondrianOlap4jMember>() {
public String getName(Object member) {
return ((MondrianOlap4jMember)member).getName();
}
public MondrianOlap4jMember get(int index) {
return new MondrianOlap4jMember(
olap4jSchema, children.get(index));
}
public int size() {
return children.size();
}
};
}
public int getChildMemberCount() throws OlapException {
final RolapConnection conn =
olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData
.olap4jConnection.getMondrianConnection();
return
Locus.execute(
conn,
"MondrianOlap4jMember.getChildMemberCount",
new Locus.Action<Integer>() {
public Integer execute() {
return
conn.getSchemaReader()
.getMemberChildren(member).size();
}
});
}
public MondrianOlap4jMember getParentMember() {
final mondrian.olap.Member parentMember = member.getParentMember();
if (parentMember == null) {
return null;
}
final RolapConnection conn =
olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData
.olap4jConnection.getMondrianConnection2();
final boolean isVisible =
Locus.execute(
conn,
"MondrianOlap4jMember.getParentMember",
new Locus.Action<Boolean>() {
public Boolean execute() {
return
conn.getSchemaReader()
.isVisible(parentMember);
}
});
if (!isVisible) {
return null;
}
return new MondrianOlap4jMember(olap4jSchema, parentMember);
}
public Level getLevel() {
return new MondrianOlap4jLevel(olap4jSchema, member.getLevel());
}
public Hierarchy getHierarchy() {
return new MondrianOlap4jHierarchy(
olap4jSchema, member.getHierarchy());
}
public Dimension getDimension() {
return new MondrianOlap4jDimension(
olap4jSchema, member.getDimension());
}
public Type getMemberType() {
return Type.valueOf(member.getMemberType().name());
}
public boolean isAll() {
return member.isAll();
}
public boolean isChildOrEqualTo(Member member) {
throw new UnsupportedOperationException();
}
public boolean isCalculated() {
return getMemberType() == Type.FORMULA;
}
public int getSolveOrder() {
return member.getSolveOrder();
}
public ParseTreeNode getExpression() {
throw new UnsupportedOperationException();
}
public List<Member> getAncestorMembers() {
final List<Member> list = new ArrayList<Member>();
MondrianOlap4jMember m = getParentMember();
while (m != null) {
list.add(m);
m = m.getParentMember();
}
return list;
}
public boolean isCalculatedInQuery() {
return member.isCalculatedInQuery();
}
public Object getPropertyValue(Property property) {
return member.getPropertyValue(property.getName());
}
public String getPropertyFormattedValue(Property property) {
return member.getPropertyFormattedValue(property.getName());
}
public void setProperty(Property property, Object value)
throws OlapException
{
member.setProperty(property.getName(), value);
}
public NamedList<Property> getProperties() {
return getLevel().getProperties();
}
public int getOrdinal() {
final Number ordinal =
(Number) member.getPropertyValue(
Property.StandardMemberProperty.MEMBER_ORDINAL.getName());
return ordinal.intValue();
}
public boolean isHidden() {
return member.isHidden();
}
public int getDepth() {
return member.getDepth();
}
public Member getDataMember() {
final mondrian.olap.Member dataMember = member.getDataMember();
if (dataMember == null) {
return null;
}
return new MondrianOlap4jMember(olap4jSchema, dataMember);
}
public String getName() {
return member.getName();
}
public String getUniqueName() {
return member.getUniqueName();
}
public String getCaption() {
return member.getCaption();
}
public String getDescription() {
return member.getDescription();
}
public boolean isVisible() {
return (Boolean) member.getPropertyValue(
mondrian.olap.Property.VISIBLE.getName());
}
protected OlapElement getOlapElement() {
return member;
}
}
// End MondrianOlap4jMember.java