001 /* 002 // $Id: //open/mondrian/src/main/mondrian/olap/CacheControl.java#6 $ 003 // This software is subject to the terms of the Common Public License 004 // Agreement, available at the following URL: 005 // http://www.opensource.org/licenses/cpl.html. 006 // Copyright (C) 2006-2008 Julian Hyde and others. 007 // All Rights Reserved. 008 // You must accept the terms of that agreement to use this software. 009 */ 010 package mondrian.olap; 011 012 import javax.sql.DataSource; 013 import java.util.*; 014 import java.io.PrintWriter; 015 016 /** 017 * API for controlling the contents of the cell cache and the member cache. 018 * A {@link CellRegion} denotes a portion of the cell cache, and a 019 * {@link MemberSet} denotes a portion of the member cache. Both caches can be 020 * flushed, and the member cache can be edited. 021 * 022 * <p>To create an instance of this interface, use 023 * {@link mondrian.olap.Connection#getCacheControl}.</p> 024 * 025 * <p>Methods concerning cell cache:<ul> 026 * <li>{@link #createMemberRegion(Member, boolean)}</li> 027 * <li>{@link #createMemberRegion(boolean, Member, boolean, Member, boolean)}</li> 028 * <li>{@link #createUnionRegion(mondrian.olap.CacheControl.CellRegion[])}</li> 029 * <li>{@link #createCrossjoinRegion(mondrian.olap.CacheControl.CellRegion[])}</li> 030 * <li>{@link #createMeasuresRegion(Cube)}</li> 031 * <li>{@link #flush(mondrian.olap.CacheControl.CellRegion)}</li> 032 * </ul></p> 033 * 034 * <p>Methods concerning member cache:<ul> 035 * <li>{@link #createMemberSet(Member, boolean)}</li> 036 * <li>{@link #createMemberSet(boolean, Member, boolean, Member, boolean)}</li> 037 * <li>{@link #createAddCommand(Member)}</li> 038 * <li>{@link #createDeleteCommand(Member)}</li> 039 * <li>{@link #createDeleteCommand(mondrian.olap.CacheControl.MemberSet)}</li> 040 * <li>{@link #createCompoundCommand(java.util.List)}</li> 041 * <li>{@link #createCompoundCommand(mondrian.olap.CacheControl.MemberEditCommand[])}</li> 042 * <li>{@link #createSetPropertyCommand(Member, String, Object)}</li> 043 * <li>{@link #createSetPropertyCommand(mondrian.olap.CacheControl.MemberSet,java.util.Map)}</li> 044 * <li>{@link #flush(mondrian.olap.CacheControl.MemberSet)}</li> 045 * <li>{@link #execute(mondrian.olap.CacheControl.MemberEditCommand)}</li> 046 * </ul></p> 047 * 048 * @author jhyde 049 * @version $Id: //open/mondrian/src/main/mondrian/olap/CacheControl.java#6 $ 050 * @since Sep 27, 2006 051 */ 052 public interface CacheControl { 053 054 // cell cache control 055 056 /** 057 * Creates a cell region consisting of a single member. 058 * 059 * @param member the member 060 * @param descendants When true, include descendants of the member in the 061 * region. 062 * @return the new cell region 063 */ 064 CellRegion createMemberRegion(Member member, boolean descendants); 065 066 /** 067 * Creates a cell region consisting of a range between two members. 068 * 069 * <p>The members must belong to the same level of the same hierarchy. 070 * One of the bounds may be null. 071 * 072 * <p>For example, given 073 * 074 * <code><pre>Member member97Q3; // [Time].[1997].[Q3] 075 * Member member98Q2; // [Time].[1998].[Q2] 076 * </pre></code> 077 * 078 * then 079 * 080 * <table border="1"> 081 * <tr> 082 * <th>Expression</th> 083 * <th>Meaning</th> 084 * </tr> 085 * 086 * <tr> 087 * <td> 088 * <code>createMemberRegion(true, member97Q3, true, member98Q2, false)</code> 089 * </td> 090 * <td>The members between 97Q3 and 98Q2, inclusive:<br/> 091 * [Time].[1997].[Q3],<br/> 092 * [Time].[1997].[Q4],<br/> 093 * [Time].[1998].[Q1],<br/> 094 * [Time].[1998].[Q2]</td> 095 * </tr> 096 * 097 * <tr> 098 * <td> 099 * <code>createMemberRegion(true, member97Q3, false, member98Q2, false)</code> 100 * </td> 101 * <td>The members between 97Q3 and 98Q2, exclusive:<br/> 102 * [Time].[1997].[Q4],<br/> 103 * [Time].[1998].[Q1]</td> 104 * </tr> 105 * 106 * <tr> 107 * <td> 108 * <code>createMemberRegion(true, member97Q3, false, member98Q2, false)</code> 109 * </td> 110 * <td>The members between 97Q3 and 98Q2, including their descendants, and 111 * including the lower bound but not the upper bound:<br/> 112 * [Time].[1997].[Q3],<br/> 113 * [Time].[1997].[Q3].[7],<br/> 114 * [Time].[1997].[Q3].[8],<br/> 115 * [Time].[1997].[Q3].[9],<br/> 116 * [Time].[1997].[Q4],<br/> 117 * [Time].[1997].[Q4].[10],<br/> 118 * [Time].[1997].[Q4].[11],<br/> 119 * [Time].[1997].[Q4].[12],<br/> 120 * [Time].[1998].[Q1],<br/> 121 * [Time].[1998].[Q1].[1],<br/> 122 * [Time].[1998].[Q1].[2],<br/> 123 * [Time].[1998].[Q1].[3]</td> 124 * </tr> 125 * </table> 126 * 127 * @param lowerInclusive whether the the range includes the lower bound; 128 * ignored if the lower bound is not specified 129 * @param lowerMember lower bound member. 130 * If null, takes all preceding members 131 * @param upperInclusive whether the the range includes the upper bound; 132 * ignored if the upper bound is not specified 133 * @param upperMember upper bound member. 134 * If null, takes all preceding members 135 * @param descendants when true, include descendants of the member in the 136 * region 137 * @return the new cell region 138 */ 139 CellRegion createMemberRegion( 140 boolean lowerInclusive, 141 Member lowerMember, 142 boolean upperInclusive, 143 Member upperMember, 144 boolean descendants); 145 146 /** 147 * Forms the cartesian product of two or more cell regions. 148 * @param regions the operands 149 * @return the cartesian product of the operands 150 */ 151 CellRegion createCrossjoinRegion(CellRegion... regions); 152 153 /** 154 * Forms the union of two or more cell regions. 155 * The regions must have the same dimensionality. 156 * 157 * @param regions the operands 158 * @return the cartesian product of the operands 159 160 */ 161 CellRegion createUnionRegion(CellRegion... regions); 162 163 /** 164 * Creates a region consisting of all measures in a given cube. 165 * @param cube a cube 166 * @return the region 167 */ 168 CellRegion createMeasuresRegion(Cube cube); 169 170 /** 171 * Atomically flushes all the cells in the cell cache that correspond to 172 * measures in a cube and to a given region. 173 * 174 * @param region a region 175 */ 176 void flush(CellRegion region); 177 178 /** 179 * Prints the state of the cell cache as it pertains to a given region. 180 * @param pw the output target 181 * @param region the CellRegion of interest 182 */ 183 void printCacheState(PrintWriter pw, CellRegion region); 184 185 // member cache control 186 187 /** 188 * Creates a member set containing either a single member, or a member and 189 * its descendants. 190 * @param member a member 191 * @param descendants when true, include descendants in the set 192 * @return the set 193 */ 194 MemberSet createMemberSet(Member member, boolean descendants); 195 196 /** 197 * Creates a member set consisting of a range between two members. 198 * The members must belong to the same level of the same hierarchy. One of 199 * the bounds may be null. (Similar to {@link #createMemberRegion(boolean, 200 * Member, boolean, Member, boolean)}, which see for examples.) 201 * 202 * @param lowerInclusive whether the the range includes the lower bound; 203 * ignored if the lower bound is not specified 204 * @param lowerMember lower bound member. 205 * If null, takes all preceding members 206 * @param upperInclusive whether the the range includes the upper bound; 207 * ignored if the upper bound is not specified 208 * @param upperMember upper bound member. 209 * If null, takes all preceding members 210 * @param descendants when true, include descendants of the member in the 211 * region 212 * @return the set 213 */ 214 MemberSet createMemberSet( 215 boolean lowerInclusive, 216 Member lowerMember, 217 boolean upperInclusive, 218 Member upperMember, 219 boolean descendants); 220 221 /** 222 * Forms the union of two or more member sets. 223 * 224 * @param sets the operands 225 * @return the union of the operands 226 */ 227 MemberSet createUnionSet(MemberSet... sets); 228 229 /** 230 * Filters a member set, keeping all members at a given Level. 231 * 232 * @param level Level 233 * @param baseSet Member set 234 * @return Member set with members not at the given level removed 235 */ 236 MemberSet filter(Level level, MemberSet baseSet); 237 238 /** 239 * Atomically flushes all members in the member cache which belong to a 240 * given set. 241 * 242 * @param set a set of members 243 */ 244 void flush(MemberSet set); 245 246 /** 247 * Prints the state of the member cache as it pertains to a given member 248 * set. 249 * @param pw the output target 250 * @param set the MemberSet of interest 251 */ 252 void printCacheState(PrintWriter pw, MemberSet set); 253 254 255 // edit member cache contents 256 257 /** 258 * Executes a command that edits the member cache. 259 * @param cmd the command 260 */ 261 void execute(MemberEditCommand cmd); 262 263 /** 264 * Builds a compound command which is executed atomically. 265 * 266 * @param cmds a list of the component commands 267 * @return the compound command 268 */ 269 MemberEditCommand createCompoundCommand(List<MemberEditCommand> cmds); 270 271 /** 272 * Builds a compound command which is executed atomically. 273 * @param cmds the component commands 274 * @return the compound command 275 */ 276 MemberEditCommand createCompoundCommand(MemberEditCommand... cmds); 277 278 // commands to change the structure of the member cache 279 280 /** 281 * Creates a command to delete a member and its descendants from the member 282 * cache. 283 * 284 * @param member the member 285 * @return the command 286 */ 287 MemberEditCommand createDeleteCommand(Member member); 288 289 /** 290 * Creates a command to delete a set of members from the member cache. 291 * 292 * @param memberSet the set 293 * @return the command 294 */ 295 MemberEditCommand createDeleteCommand(MemberSet memberSet); 296 297 /** 298 * Creates a command to add a member to the cache. The added member and its 299 * parent must have the same Dimension and the correct Levels, Null parent 300 * means add to the top level of its Dimension. 301 * 302 * <p>The ordinal position of the new member among its siblings is implied 303 * by its properties.</p> 304 * 305 * @param member the new member 306 * @return the command 307 * 308 * @throws IllegalArgumentException if member null 309 * or if member belongs to a parent-child hierarchy 310 */ 311 MemberEditCommand createAddCommand( 312 Member member) throws IllegalArgumentException; 313 314 /** 315 * Creates a command to Move a member (with its descendants) to a new 316 * location, that is to a new parent. 317 * @param member the member moved 318 * @param loc the new parent 319 * @return the command 320 * 321 * @throws IllegalArgumentException if member is null, 322 * or loc is null, 323 * or member belongs to a parent-child hierarchy, 324 * or if loc is incompatible with member 325 */ 326 MemberEditCommand createMoveCommand( 327 Member member, 328 Member loc) throws IllegalArgumentException; 329 330 // commands to change member properties 331 332 /** 333 * Creates a command to change one property of a member. 334 * 335 * @param member the member 336 * @param name the property name 337 * @param value the property value 338 * @return the command 339 * @throws IllegalArgumentException if the property is invalid for the 340 * member 341 */ 342 MemberEditCommand createSetPropertyCommand( 343 Member member, 344 String name, 345 Object value) throws IllegalArgumentException; 346 347 /** 348 * Creates a command to several properties changes over a set of 349 * members. All members must belong to the same Level. 350 * 351 * @param set the set of members 352 * @param propertyValues Collection of property-value pairs 353 * @return the command 354 * @throws IllegalArgumentException for an invalid property, or if all 355 * members in the set do not belong to the same Level. 356 */ 357 MemberEditCommand createSetPropertyCommand( 358 MemberSet set, 359 Map<String,Object> propertyValues) 360 throws IllegalArgumentException; 361 362 // other 363 364 /** 365 * Prints a debug message. 366 * 367 * @param message the message 368 */ 369 void trace(String message); 370 371 /** 372 * Flushes the cache which maps schema URLs to metadata. 373 * 374 * <p>This cache is referenced only when creating a new connection, so 375 * existing connections will continue to use the same schema definition. 376 */ 377 void flushSchemaCache(); 378 379 // todo: document 380 void flushSchema( 381 final String catalogUrl, 382 final String connectionKey, 383 final String jdbcUser, 384 String dataSourceStr); 385 386 // todo: document 387 void flushSchema( 388 String catalogUrl, 389 DataSource dataSource); 390 391 /** 392 * Flushes the given Schema instance from the pool 393 * 394 * @param schema Schema 395 */ 396 void flushSchema(Schema schema); 397 398 399 /** a region of cells in the cell cache */ 400 public interface CellRegion { 401 /** 402 * Returns the dimensionality of a region. 403 * @return a list of {@link mondrian.olap.Dimension} objects. 404 */ 405 List<Dimension> getDimensionality(); 406 } 407 408 /** 409 * A specification of a set of members in the member cache. 410 * 411 * <p>Member sets can be created using methods 412 * {@link CacheControl#createMemberSet(Member, boolean)}, 413 * {@link CacheControl#createMemberSet(boolean, Member, boolean, Member, boolean)}, 414 * {@link CacheControl#createUnionSet(mondrian.olap.CacheControl.MemberSet[])}. 415 */ 416 public interface MemberSet { 417 } 418 419 /** 420 * An operation to be applied to the member cache. The operation does not 421 * take effect until {@link CacheControl#execute} is called. 422 */ 423 public interface MemberEditCommand { 424 } 425 426 } 427 428 // End CacheControl.java