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-2013 Pentaho
008// All Rights Reserved.
009*/
010package mondrian.olap4j;
011
012import mondrian.olap.OlapElement;
013
014import org.olap4j.OlapException;
015import org.olap4j.impl.*;
016import org.olap4j.metadata.*;
017
018import java.util.List;
019
020/**
021 * Implementation of {@link org.olap4j.metadata.Hierarchy}
022 * for the Mondrian OLAP engine.
023 *
024 * @author jhyde
025 * @since May 25, 2007
026 */
027class MondrianOlap4jHierarchy
028    extends MondrianOlap4jMetadataElement
029    implements Hierarchy, Named
030{
031    final MondrianOlap4jSchema olap4jSchema;
032    final mondrian.olap.Hierarchy hierarchy;
033
034    MondrianOlap4jHierarchy(
035        MondrianOlap4jSchema olap4jSchema,
036        mondrian.olap.Hierarchy hierarchy)
037    {
038        this.olap4jSchema = olap4jSchema;
039        this.hierarchy = hierarchy;
040    }
041
042    public boolean equals(Object obj) {
043        return obj instanceof MondrianOlap4jHierarchy
044            && hierarchy.equals(((MondrianOlap4jHierarchy) obj).hierarchy);
045    }
046
047    public int hashCode() {
048        return hierarchy.hashCode();
049    }
050
051    public Dimension getDimension() {
052        return new MondrianOlap4jDimension(
053            olap4jSchema, hierarchy.getDimension());
054    }
055
056    public NamedList<Level> getLevels() {
057        final NamedList<MondrianOlap4jLevel> list =
058            new NamedListImpl<MondrianOlap4jLevel>();
059        final MondrianOlap4jConnection olap4jConnection =
060            olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection;
061        final mondrian.olap.SchemaReader schemaReader =
062            olap4jConnection.getMondrianConnection2().getSchemaReader()
063                .withLocus();
064        for (mondrian.olap.Level level
065            : schemaReader.getHierarchyLevels(hierarchy))
066        {
067            list.add(olap4jConnection.toOlap4j(level));
068        }
069        return Olap4jUtil.cast(list);
070    }
071
072    public boolean hasAll() {
073        return hierarchy.hasAll();
074    }
075
076    public Member getDefaultMember() throws OlapException {
077        final MondrianOlap4jConnection olap4jConnection =
078            olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection;
079        final mondrian.olap.SchemaReader schemaReader =
080            olap4jConnection.getMondrianConnection()
081                .getSchemaReader().withLocus();
082        return
083            olap4jConnection.toOlap4j(
084                schemaReader.getHierarchyDefaultMember(hierarchy));
085    }
086
087    public NamedList<Member> getRootMembers() throws OlapException {
088        final MondrianOlap4jConnection olap4jConnection =
089            olap4jSchema.olap4jCatalog.olap4jDatabaseMetaData.olap4jConnection;
090        final List<mondrian.olap.Member> levelMembers =
091            olap4jConnection.getMondrianConnection().getSchemaReader()
092                .withLocus()
093                .getLevelMembers(
094                    hierarchy.getLevels()[0], true);
095
096        return new AbstractNamedList<Member>() {
097            public String getName(Object member) {
098                return ((Member)member).getName();
099            }
100
101            public Member get(int index) {
102                return olap4jConnection.toOlap4j(levelMembers.get(index));
103            }
104
105            public int size() {
106                return levelMembers.size();
107            }
108        };
109    }
110
111    public String getName() {
112        return hierarchy.getName();
113    }
114
115    public String getUniqueName() {
116        return hierarchy.getUniqueName();
117    }
118
119    public String getCaption() {
120        return hierarchy.getLocalized(
121            OlapElement.LocalizedProperty.CAPTION,
122            olap4jSchema.getLocale());
123    }
124
125    public String getDescription() {
126        return hierarchy.getLocalized(
127            OlapElement.LocalizedProperty.DESCRIPTION,
128            olap4jSchema.getLocale());
129    }
130
131    public boolean isVisible() {
132        return hierarchy.isVisible();
133    }
134
135    protected OlapElement getOlapElement() {
136        return hierarchy;
137    }
138}
139
140// End MondrianOlap4jHierarchy.java