001/*
002// This software is subject to the terms of the Eclipse Public License v1.0
003// Agreement, available at the following URL:
004// http://www.eclipse.org/legal/epl-v10.html.
005// You must accept the terms of that agreement to use this software.
006//
007// Copyright (C) 2007-2012 Pentaho
008// All Rights Reserved.
009*/
010package mondrian.olap4j;
011
012import mondrian.olap.OlapElement;
013import mondrian.rolap.RolapMeasure;
014
015import org.olap4j.OlapException;
016import org.olap4j.impl.AbstractNamedList;
017import org.olap4j.impl.Named;
018import org.olap4j.mdx.ParseTreeNode;
019import org.olap4j.metadata.*;
020
021import java.util.ArrayList;
022import java.util.List;
023
024/**
025 * Implementation of {@link Member}
026 * for the Mondrian OLAP engine,
027 * as a wrapper around a mondrian
028 * {@link mondrian.olap.Member}.
029 *
030 * @author jhyde
031 * @since May 25, 2007
032 */
033class MondrianOlap4jMember
034    extends MondrianOlap4jMetadataElement
035    implements Member, Named
036{
037    final mondrian.olap.Member member;
038    final MondrianOlap4jSchema olap4jSchema;
039
040    MondrianOlap4jMember(
041        MondrianOlap4jSchema olap4jSchema,
042        mondrian.olap.Member mondrianMember)
043    {
044        assert mondrianMember != null;
045        assert mondrianMember instanceof RolapMeasure
046            == this instanceof MondrianOlap4jMeasure;
047        this.olap4jSchema = olap4jSchema;
048        this.member = mondrianMember;
049    }
050
051    public boolean equals(Object obj) {
052        return obj instanceof MondrianOlap4jMember
053            && member.equals(((MondrianOlap4jMember) obj).member);
054    }
055
056    public int hashCode() {
057        return member.hashCode();
058    }
059
060    public String toString() {
061        return getUniqueName();
062    }
063
064    public NamedList<MondrianOlap4jMember> getChildMembers()
065        throws OlapException
066    {
067        final List<mondrian.olap.Member> children =
068            olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection
069                .getMondrianConnection().getSchemaReader()
070                .withLocus().getMemberChildren(
071                    member);
072        return new AbstractNamedList<MondrianOlap4jMember>() {
073            public String getName(Object member) {
074                return ((MondrianOlap4jMember)member).getName();
075            }
076
077            public MondrianOlap4jMember get(int index) {
078                return new MondrianOlap4jMember(
079                    olap4jSchema, children.get(index));
080            }
081
082            public int size() {
083                return children.size();
084            }
085        };
086    }
087
088    public int getChildMemberCount() throws OlapException {
089        return olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData
090            .olap4jConnection.getMondrianConnection().getSchemaReader()
091            .withLocus()
092            .getMemberChildren(member).size();
093    }
094
095    public MondrianOlap4jMember getParentMember() {
096        final mondrian.olap.Member parentMember = member.getParentMember();
097        if (parentMember == null
098            || !olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData
099            .olap4jConnection.getMondrianConnection2().getSchemaReader()
100            .withLocus().isVisible(
101                parentMember))
102        {
103            return null;
104        }
105        return new MondrianOlap4jMember(olap4jSchema, parentMember);
106    }
107
108    public Level getLevel() {
109        return new MondrianOlap4jLevel(olap4jSchema, member.getLevel());
110    }
111
112    public Hierarchy getHierarchy() {
113        return new MondrianOlap4jHierarchy(
114            olap4jSchema, member.getHierarchy());
115    }
116
117    public Dimension getDimension() {
118        return new MondrianOlap4jDimension(
119            olap4jSchema, member.getDimension());
120    }
121
122    public Type getMemberType() {
123        return Type.valueOf(member.getMemberType().name());
124    }
125
126    public boolean isAll() {
127        return member.isAll();
128    }
129
130    public boolean isChildOrEqualTo(Member member) {
131        throw new UnsupportedOperationException();
132    }
133
134    public boolean isCalculated() {
135        return getMemberType() == Type.FORMULA;
136    }
137
138    public int getSolveOrder() {
139        return member.getSolveOrder();
140    }
141
142    public ParseTreeNode getExpression() {
143        throw new UnsupportedOperationException();
144    }
145
146    public List<Member> getAncestorMembers() {
147        final List<Member> list = new ArrayList<Member>();
148        MondrianOlap4jMember m = getParentMember();
149        while (m != null) {
150            list.add(m);
151            m = m.getParentMember();
152        }
153        return list;
154    }
155
156    public boolean isCalculatedInQuery() {
157        return member.isCalculatedInQuery();
158    }
159
160    public Object getPropertyValue(Property property) {
161        return member.getPropertyValue(property.getName());
162    }
163
164    public String getPropertyFormattedValue(Property property) {
165        return member.getPropertyFormattedValue(property.getName());
166    }
167
168    public void setProperty(Property property, Object value)
169        throws OlapException
170    {
171        member.setProperty(property.getName(), value);
172    }
173
174    public NamedList<Property> getProperties() {
175        return getLevel().getProperties();
176    }
177
178    public int getOrdinal() {
179        final Number ordinal =
180            (Number) member.getPropertyValue(
181                Property.StandardMemberProperty.MEMBER_ORDINAL.getName());
182        return ordinal.intValue();
183    }
184
185    public boolean isHidden() {
186        return member.isHidden();
187    }
188
189    public int getDepth() {
190        return member.getDepth();
191    }
192
193    public Member getDataMember() {
194        final mondrian.olap.Member dataMember = member.getDataMember();
195        if (dataMember == null) {
196            return null;
197        }
198        return new MondrianOlap4jMember(olap4jSchema, dataMember);
199    }
200
201    public String getName() {
202        return member.getName();
203    }
204
205    public String getUniqueName() {
206        return member.getUniqueName();
207    }
208
209    public String getCaption() {
210        return member.getCaption();
211    }
212
213    public String getDescription() {
214        return member.getDescription();
215    }
216
217    public boolean isVisible() {
218        return (Boolean) member.getPropertyValue(
219            mondrian.olap.Property.VISIBLE.getName());
220    }
221
222    protected OlapElement getOlapElement() {
223        return member;
224    }
225}
226
227// End MondrianOlap4jMember.java