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