| 1 13 14 package mondrian.rolap; 15 import java.util.ArrayList ; 16 import java.util.HashMap ; 17 import java.util.List ; 18 import java.util.Map ; 19 20 import mondrian.olap.Util; 21 import mondrian.rolap.TupleReader.MemberBuilder; 22 import mondrian.rolap.sql.TupleConstraint; 23 import mondrian.rolap.sql.MemberChildrenConstraint; 24 25 37 class CacheMemberReader implements MemberReader, MemberCache { 38 private final MemberSource source; 39 private final RolapMember[] members; 40 41 private final Map <Object , RolapMember> mapKeyToMember; 42 43 CacheMemberReader(MemberSource source) { 44 this.source = source; 45 if (false) { 46 Util.discard(source.setCache(this)); 48 } 49 this.mapKeyToMember = new HashMap <Object , RolapMember>(); 50 this.members = source.getMembers(); 51 for (int i = 0; i < members.length; i++) { 52 members[i].setOrdinal(i); 53 } 54 } 55 56 public RolapHierarchy getHierarchy() { 58 return source.getHierarchy(); 59 } 60 61 public boolean setCache(MemberCache cache) { 62 return false; 65 } 66 67 public RolapMember[] getMembers() { 69 return members; 70 } 71 72 public Object makeKey(RolapMember parent, Object key) { 74 return new MemberKey(parent, key); 75 } 76 77 public RolapMember getMember(Object key) { 79 return mapKeyToMember.get(key); 80 } 81 public RolapMember getMember(Object key, boolean mustCheckCacheStatus) { 82 return mapKeyToMember.get(key); 83 } 84 85 public Object putMember(Object key, RolapMember value) { 87 return mapKeyToMember.put(key, value); 88 } 89 90 public void putChildren( 93 RolapMember member, 94 MemberChildrenConstraint constraint, 95 List <RolapMember> children) 96 { 97 throw new UnsupportedOperationException (); 98 } 99 100 public List <RolapMember> getChildrenFromCache( 103 RolapMember member, 104 MemberChildrenConstraint constraint) 105 { 106 return null; 107 } 108 109 public List getLevelMembersFromCache(RolapLevel level, TupleConstraint constraint) { 112 return null; 113 } 114 115 public RolapMember lookupMember(String [] uniqueNameParts, 116 boolean failIfNotFound) { 117 return RolapUtil.lookupMember(this, uniqueNameParts, failIfNotFound); 118 } 119 120 public List <RolapMember> getRootMembers() { 121 List <RolapMember> list = new ArrayList <RolapMember>(); 122 for (RolapMember member : members) { 123 if (member.getParentUniqueName() == null) { 124 list.add(member); 125 } 126 } 127 return list; 128 } 129 130 public List <RolapMember> getMembersInLevel( 131 RolapLevel level, 132 int startOrdinal, 133 int endOrdinal) 134 { 135 List <RolapMember> list = new ArrayList <RolapMember>(); 136 int levelDepth = level.getDepth(); 137 for (RolapMember member : members) { 138 if ((member.getLevel().getDepth() == levelDepth) && 139 (startOrdinal <= member.getOrdinal()) && 140 (member.getOrdinal() < endOrdinal)) { 141 142 list.add(member); 143 } 144 } 145 return list; 146 } 147 148 public List <RolapMember> getMembersInLevel( 149 RolapLevel level, 150 int startOrdinal, 151 int endOrdinal, 152 TupleConstraint constraint) 153 { 154 return getMembersInLevel(level, startOrdinal, endOrdinal); 155 } 156 157 public void getMemberChildren( 158 RolapMember parentMember, 159 List <RolapMember> children) 160 { 161 for (RolapMember member : members) { 162 if (member.getParentMember() == parentMember) { 163 children.add(member); 164 } 165 } 166 } 167 168 public void getMemberChildren( 169 RolapMember member, 170 List <RolapMember> children, 171 MemberChildrenConstraint constraint) 172 { 173 getMemberChildren(member, children); 174 } 175 176 public void getMemberChildren( 177 List <RolapMember> parentMembers, 178 List <RolapMember> children) { 179 for (RolapMember member : members) { 180 if (parentMembers.contains(member.getParentMember())) { 181 children.add(member); 182 } 183 } 184 } 185 186 public void getMemberChildren( 187 List <RolapMember> parentMembers, 188 List <RolapMember> children, 189 MemberChildrenConstraint constraint) 190 { 191 getMemberChildren(parentMembers, children); 192 } 193 194 public RolapMember getLeadMember(RolapMember member, int n) { 195 if (n >= 0) { 196 for (int ordinal = member.getOrdinal(); ordinal < members.length; 197 ordinal++) { 198 if ((members[ordinal].getLevel() == member.getLevel()) && 199 (n-- == 0)) { 200 201 return members[ordinal]; 202 } 203 } 204 return (RolapMember) member.getHierarchy().getNullMember(); 205 206 } else { 207 for (int ordinal = member.getOrdinal(); ordinal >= 0; ordinal--) { 208 if ((members[ordinal].getLevel() == member.getLevel()) && 209 (n++ == 0)) { 210 return members[ordinal]; 211 } 212 } 213 return (RolapMember) member.getHierarchy().getNullMember(); 214 } 215 } 216 217 public void getMemberRange( 218 RolapLevel level, 219 RolapMember startMember, 220 RolapMember endMember, 221 List <RolapMember> list) 222 { 223 Util.assertPrecondition(startMember != null, "startMember != null"); 224 Util.assertPrecondition(endMember != null, "endMember != null"); 225 Util.assertPrecondition(startMember.getLevel() == endMember.getLevel(), 226 "startMember.getLevel() == endMember.getLevel()"); 227 228 for (int i = startMember.getOrdinal(); i <= endMember.getOrdinal(); i++) { 229 if (members[i].getLevel() == endMember.getLevel()) { 230 list.add(members[i]); 231 } 232 } 233 } 234 235 public int getMemberCount() { 236 return members.length; 237 } 238 239 public int compare(RolapMember m1, RolapMember m2, boolean siblingsAreEqual) { 240 if (m1 == m2) { 241 return 0; 242 } 243 if (siblingsAreEqual && 244 (m1.getParentMember() == m2.getParentMember())) { 245 return 0; 246 } 247 Util.assertTrue(members[m1.getOrdinal()] == m1); 248 Util.assertTrue(members[m2.getOrdinal()] == m2); 249 250 return (m1.getOrdinal() < m2.getOrdinal()) ? -1 : 1; 251 } 252 253 public MemberBuilder getMemberBuilder() { 254 return null; 255 } 256 257 } 258 259 | Popular Tags |