KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > rolap > CacheMemberReader


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/rolap/CacheMemberReader.java#25 $
3 // This software is subject to the terms of the Common Public License
4 // Agreement, available at the following URL:
5 // http://www.opensource.org/licenses/cpl.html.
6 // Copyright (C) 2001-2002 Kana Software, Inc.
7 // Copyright (C) 2001-2007 Julian Hyde and others
8 // All Rights Reserved.
9 // You must accept the terms of that agreement to use this software.
10 //
11 // jhyde, 21 December, 2001
12 */

13
14 package mondrian.rolap;
15 import java.util.ArrayList JavaDoc;
16 import java.util.HashMap JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Map JavaDoc;
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 /**
26  * <code>CacheMemberReader</code> implements {@link MemberReader} by reading
27  * from a pre-populated array of {@link mondrian.olap.Member}s.
28  *
29  * <p>Note: CacheMemberReader can not handle ragged hierarchies. (HR
30  * Tests fail if {@link SmartMemberReader} is replaced with
31  * CacheMemberReader).
32  *
33  * @author jhyde
34  * @since 21 December, 2001
35  * @version $Id: //open/mondrian/src/main/mondrian/rolap/CacheMemberReader.java#25 $
36  */

37 class CacheMemberReader implements MemberReader, MemberCache {
38     private final MemberSource source;
39     private final RolapMember[] members;
40     /** Maps a {@link MemberKey} to a {@link RolapMember}. */
41     private final Map JavaDoc<Object JavaDoc, RolapMember> mapKeyToMember;
42
43     CacheMemberReader(MemberSource source) {
44         this.source = source;
45         if (false) {
46             // we don't want the reader to write back to our cache
47
Util.discard(source.setCache(this));
48         }
49         this.mapKeyToMember = new HashMap JavaDoc<Object JavaDoc, RolapMember>();
50         this.members = source.getMembers();
51         for (int i = 0; i < members.length; i++) {
52             members[i].setOrdinal(i);
53         }
54     }
55
56     // implement MemberReader
57
public RolapHierarchy getHierarchy() {
58         return source.getHierarchy();
59     }
60
61     public boolean setCache(MemberCache cache) {
62         // we do not support cache writeback -- we must be masters of our
63
// own cache
64
return false;
65     }
66
67     // implement MemberReader
68
public RolapMember[] getMembers() {
69         return members;
70     }
71
72     // implement MemberCache
73
public Object JavaDoc makeKey(RolapMember parent, Object JavaDoc key) {
74         return new MemberKey(parent, key);
75     }
76
77     // implement MemberCache
78
public RolapMember getMember(Object JavaDoc key) {
79         return mapKeyToMember.get(key);
80     }
81     public RolapMember getMember(Object JavaDoc key, boolean mustCheckCacheStatus) {
82         return mapKeyToMember.get(key);
83     }
84
85     // implement MemberCache
86
public Object JavaDoc putMember(Object JavaDoc key, RolapMember value) {
87         return mapKeyToMember.put(key, value);
88     }
89
90     // don't need to implement this MemberCache method because we're never
91
// used in a context where it is needed
92
public void putChildren(
93         RolapMember member,
94         MemberChildrenConstraint constraint,
95         List JavaDoc<RolapMember> children)
96     {
97         throw new UnsupportedOperationException JavaDoc();
98     }
99
100     // don't need to implement this MemberCache method because we're never
101
// used in a context where it is needed
102
public List JavaDoc<RolapMember> getChildrenFromCache(
103         RolapMember member,
104         MemberChildrenConstraint constraint)
105     {
106         return null;
107     }
108
109     // don't need to implement this MemberCache method because we're never
110
// used in a context where it is needed
111
public List JavaDoc getLevelMembersFromCache(RolapLevel level, TupleConstraint constraint) {
112         return null;
113     }
114
115     public RolapMember lookupMember(String JavaDoc[] uniqueNameParts,
116                                     boolean failIfNotFound) {
117         return RolapUtil.lookupMember(this, uniqueNameParts, failIfNotFound);
118     }
119
120     public List JavaDoc<RolapMember> getRootMembers() {
121         List JavaDoc<RolapMember> list = new ArrayList JavaDoc<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 JavaDoc<RolapMember> getMembersInLevel(
131         RolapLevel level,
132         int startOrdinal,
133         int endOrdinal)
134     {
135         List JavaDoc<RolapMember> list = new ArrayList JavaDoc<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 JavaDoc<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 JavaDoc<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 JavaDoc<RolapMember> children,
171         MemberChildrenConstraint constraint)
172     {
173         getMemberChildren(member, children);
174     }
175
176     public void getMemberChildren(
177         List JavaDoc<RolapMember> parentMembers,
178         List JavaDoc<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 JavaDoc<RolapMember> parentMembers,
188         List JavaDoc<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 JavaDoc<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 // End CacheMemberReader.java
260
Popular Tags