001// Generated from MondrianProperties.xml. 002package mondrian.olap; 003 004import org.eigenbase.util.property.*; 005import java.io.File; 006 007/** 008 * Configuration properties that determine the 009 * behavior of a mondrian instance. 010 * 011 * <p>There is a method for property valid in a 012 * <code>mondrian.properties</code> file. Although it is possible to retrieve 013 * properties using the inherited {@link java.util.Properties#getProperty(String)} 014 * method, we recommend that you use methods in this class.</p> 015 */ 016public class MondrianProperties extends MondrianPropertiesBase { 017 /** 018 * Properties, drawn from {@link System#getProperties}, 019 * plus the contents of "mondrian.properties" if it 020 * exists. A singleton. 021 */ 022 private static final MondrianProperties instance = 023 new MondrianProperties(); 024 025 private MondrianProperties() { 026 super( 027 new FilePropertySource( 028 new File(mondrianDotProperties))); 029 populate(); 030 } 031 032 /** 033 * Returns the singleton. 034 * 035 * @return Singleton instance 036 */ 037 public static MondrianProperties instance() { 038 // NOTE: We used to instantiate on demand, but 039 // synchronization overhead was significant. See 040 // MONDRIAN-978. 041 return instance; 042 } 043 044 /** 045 * <p>String property that is the AggRule element's tag value.</p> 046 * 047 * <p>Normally, this property is not set by a user.</p> 048 */ 049 public transient final StringProperty AggregateRuleTag = 050 new StringProperty( 051 this, "mondrian.rolap.aggregates.rule.tag", "default"); 052 053 /** 054 * <p>String property containing the name of the file which defines the 055 * rules for recognizing an aggregate table. Can be either a resource in 056 * the Mondrian jar or a URL.</p> 057 * 058 * <p>The default value is "/DefaultRules.xml", which is in the 059 * mondrian.rolap.aggmatcher package in Mondrian.jar.</p> 060 * 061 * <p>Normally, this property is not set by a user.</p> 062 */ 063 public transient final StringProperty AggregateRules = 064 new StringProperty( 065 this, "mondrian.rolap.aggregates.rules", "/DefaultRules.xml"); 066 067 /** 068 * <p>Alerting action to take in case native evaluation of a function is 069 * enabled but not supported for that function's usage in a particular 070 * query. (No alert is ever raised in cases where native evaluation would 071 * definitely have been wasted effort.)</p> 072 * 073 * <p>Recognized actions:</p> 074 * 075 * <ul> 076 * <li><code>OFF</code>: do nothing (default action, also used if 077 * unrecognized action is specified)</li> 078 * <li><code>WARN</code>: log a warning to RolapUtil logger</li> 079 * <li><code>ERROR</code>: throw an instance of 080 * {@link NativeEvaluationUnsupportedException}</li> 081 * </ul> 082 */ 083 public transient final StringProperty AlertNativeEvaluationUnsupported = 084 new StringProperty( 085 this, "mondrian.native.unsupported.alert", "OFF"); 086 087 /** 088 * Boolean property that controls whether the MDX parser resolves uses 089 * case-sensitive matching when looking up identifiers. The default is 090 * false. 091 */ 092 public transient final BooleanProperty CaseSensitive = 093 new BooleanProperty( 094 this, "mondrian.olap.case.sensitive", false); 095 096 /** 097 * Property that contains the URL of the catalog to be used by 098 * {@link mondrian.tui.CmdRunner} and XML/A Test. 099 */ 100 public transient final StringProperty CatalogURL = 101 new StringProperty( 102 this, "mondrian.catalogURL", null); 103 104 /** 105 * Integer property that, if set to a value greater than zero, sets a hard limit on the 106 * number of cells that are batched together when building segments. 107 */ 108 public transient final IntegerProperty CellBatchSize = 109 new IntegerProperty( 110 this, "mondrian.rolap.cellBatchSize", -1); 111 112 /** 113 * <p>Boolean property that controls whether aggregate tables 114 * are ordered by their volume or row count.</p> 115 * 116 * <p>If true, Mondrian uses the aggregate table with the smallest volume 117 * (number of rows multiplied by number of columns); if false, Mondrian 118 * uses the aggregate table with the fewest rows.</p> 119 */ 120 public transient final BooleanProperty ChooseAggregateByVolume = 121 new BooleanProperty( 122 this, "mondrian.rolap.aggregates.ChooseByVolume", false); 123 124 /** 125 * Boolean property that controls whether sibling members are 126 * compared according to order key value fetched from their ordinal 127 * expression. The default is false (only database ORDER BY is used). 128 */ 129 public transient final BooleanProperty CompareSiblingsByOrderKey = 130 new BooleanProperty( 131 this, "mondrian.rolap.compareSiblingsByOrderKey", false); 132 133 /** 134 * <p>Property that defines 135 * when to apply the crossjoin optimization algorithm.</p> 136 * 137 * <p>If a crossjoin input list's size is larger than this property's 138 * value and the axis has the "NON EMPTY" qualifier, then 139 * the crossjoin non-empty optimizer is applied. 140 * Setting this value to '0' means that for all crossjoin 141 * input lists in non-empty axes will have the optimizer applied. 142 * On the other hand, if the value is set larger than any possible 143 * list, say <code>Integer.MAX_VALUE</code>, then the optimizer 144 * will never be applied.</p> 145 */ 146 public transient final IntegerProperty CrossJoinOptimizerSize = 147 new IntegerProperty( 148 this, "mondrian.olap.fun.crossjoin.optimizer.size", 0); 149 150 /** 151 * <p>Property that defines 152 * the name of the plugin class that resolves data source names to 153 * {@link javax.sql.DataSource} objects. The class must implement the 154 * {@link mondrian.spi.DataSourceResolver} interface. If not specified, 155 * the default implementation uses JNDI to perform resolution.</p> 156 * 157 * <p>Example:</p> 158 * <blockquote><code>mondrian.spi.dataSourceResolverClass=mondrian.spi.impl.JndiDataSourceResolver</code></blockquote> 159 */ 160 public transient final StringProperty DataSourceResolverClass = 161 new StringProperty( 162 this, "mondrian.spi.dataSourceResolverClass", null); 163 164 /** 165 * Boolean property that controls whether a RolapStar's 166 * aggregate data cache is cleared after each query. 167 * If true, no RolapStar will cache aggregate data from one 168 * query to the next (the cache is cleared after each query). 169 */ 170 public transient final BooleanProperty DisableCaching = 171 new BooleanProperty( 172 this, "mondrian.rolap.star.disableCaching", false); 173 174 /** 175 * Boolean property that controls whether the data from segments 176 * is cached locally. To create custom caches, look for the 177 * SegmentCache SPI. 178 */ 179 public transient final BooleanProperty DisableLocalSegmentCache = 180 new BooleanProperty( 181 this, "mondrian.rolap.star.disableLocalSegmentCache", false); 182 183 /** 184 * <p>Property that controls whether aggregation cache hit / miss 185 * counters will be enabled.</p> 186 * 187 * <p>Note that this will affect performance due to existence of sync 188 * blocks.</p> 189 * 190 * @deprecated This property is no longer used, and will be removed in 191 * mondrian-4.0. 192 */ 193 public transient final BooleanProperty EnableCacheHitCounters = 194 new BooleanProperty( 195 this, "mondrian.rolap.agg.enableCacheHitCounters", false); 196 197 /** 198 * If disabled, Mondrian will throw an exception if someone attempts to 199 * perform a drillthrough of any kind. 200 */ 201 public transient final BooleanProperty EnableDrillThrough = 202 new BooleanProperty( 203 this, "mondrian.drillthrough.enable", true); 204 205 /** 206 * Boolean property that controls whether to use a cache for frequently 207 * evaluated expressions. With the cache disabled, an expression like 208 * <code>Rank([Product].CurrentMember, 209 * Order([Product].MEMBERS, [Measures].[Unit Sales]))</code> would perform 210 * many redundant sorts. The default is true. 211 */ 212 public transient final BooleanProperty EnableExpCache = 213 new BooleanProperty( 214 this, "mondrian.expCache.enable", true); 215 216 /** 217 * <p>Property that defines 218 * whether to generate SQL queries using the <code>GROUPING SETS</code> 219 * construct for rollup. By default it is not enabled.</p> 220 * 221 * <p>Ignored on databases which do not support the 222 * <code>GROUPING SETS</code> construct (see 223 * {@link mondrian.spi.Dialect#supportsGroupingSets}).</p> 224 */ 225 public transient final BooleanProperty EnableGroupingSets = 226 new BooleanProperty( 227 this, "mondrian.rolap.groupingsets.enable", false); 228 229 /** 230 * Property which turns on or off the in-memory rollup 231 * of segment data. Defaults to <code>true</code>. 232 */ 233 public transient final BooleanProperty EnableInMemoryRollup = 234 new BooleanProperty( 235 this, "mondrian.rolap.EnableInMemoryRollup", true); 236 237 /** 238 * If enabled some NON EMPTY CrossJoin will be computed in SQL. 239 */ 240 public transient final BooleanProperty EnableNativeCrossJoin = 241 new BooleanProperty( 242 this, "mondrian.native.crossjoin.enable", true); 243 244 /** 245 * If enabled some Filter() will be computed in SQL. 246 */ 247 public transient final BooleanProperty EnableNativeFilter = 248 new BooleanProperty( 249 this, "mondrian.native.filter.enable", true); 250 251 /** 252 * <p>If enabled some NON EMPTY set operations like member.children, 253 * level.members and member descendants will be computed in SQL.</p> 254 */ 255 public transient final BooleanProperty EnableNativeNonEmpty = 256 new BooleanProperty( 257 this, "mondrian.native.nonempty.enable", true); 258 259 /** 260 * If enabled some TopCount will be computed in SQL. 261 */ 262 public transient final BooleanProperty EnableNativeTopCount = 263 new BooleanProperty( 264 this, "mondrian.native.topcount.enable", true); 265 266 /** 267 * Boolean property that controls whether each query axis implicit has the 268 * NON EMPTY option set. The default is false. 269 */ 270 public transient final BooleanProperty EnableNonEmptyOnAllAxis = 271 new BooleanProperty( 272 this, "mondrian.rolap.nonempty", false); 273 274 /** 275 * <p>Property that determines whether to cache RolapCubeMember objects, 276 * each of which associates a member of a shared hierarchy with a 277 * particular cube in which it is being used.</p> 278 * 279 * <p>The default is {@code true}, that is, use a cache. If you wish to use 280 * the member cache control aspects of {@link mondrian.olap.CacheControl}, 281 * you must set this property to {@code false}.</p> 282 * 283 * <p>RolapCubeMember has recently become more lightweight to 284 * construct, and we may obsolete this cache and this 285 * property.</p> 286 */ 287 public transient final BooleanProperty EnableRolapCubeMemberCache = 288 new BooleanProperty( 289 this, "mondrian.rolap.EnableRolapCubeMemberCache", true); 290 291 /** 292 * If enabled, first row in the result of an XML/A drill-through request 293 * will be filled with the total count of rows in underlying database. 294 */ 295 public transient final BooleanProperty EnableTotalCount = 296 new BooleanProperty( 297 this, "mondrian.xmla.drillthroughTotalCount.enable", true); 298 299 /** 300 * <p>Boolean property that controls whether to notify the Mondrian system 301 * when a {@link MondrianProperties property value} changes.</p> 302 * 303 * <p>This allows objects dependent on Mondrian properties to react (that 304 * is, reload), when a given property changes via, say, 305 * <code>MondrianProperties.instance().populate(null)</code> or 306 * <code>MondrianProperties.instance().QueryLimit.set(50)</code>.</p> 307 */ 308 public transient final BooleanProperty EnableTriggers = 309 new BooleanProperty( 310 this, "mondrian.olap.triggers.enable", true); 311 312 /** 313 * <p>Property that defines how many previous execution instances the 314 * <code>Monitor</code> keeps in its history so that it can send the events 315 * which happen after the fact. Setting this property too high will make the 316 * JVM run out of memory. Setting it too low might prevent some events from 317 * reaching the listeners of the monitor.</p> 318 * <p>This property is for internal use only and should not be changed 319 * unless required. Defaults to 1,000.</p> 320 */ 321 public transient final IntegerProperty ExecutionHistorySize = 322 new IntegerProperty( 323 this, "mondrian.server.monitor.executionHistorySize", 1000); 324 325 /** 326 * <p>Property that defines 327 * the name of the class used to compile scalar expressions.</p> 328 * 329 * <p>If the value is 330 * non-null, it is used by the <code>ExpCompiler.Factory</code> 331 * to create the implementation.</p> 332 * 333 * <p>To test that for all test MDX queries that all functions can 334 * handle requests for ITERABLE, LIST and MUTABLE_LIST evaluation 335 * results, use the following:</p> 336 * 337 * <blockquote><code>mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler</code></blockquote> 338 */ 339 public transient final StringProperty ExpCompilerClass = 340 new StringProperty( 341 this, "mondrian.calc.ExpCompiler.class", null); 342 343 /** 344 * If this property is true, when looking for native evaluation of an 345 * expression, Mondrian will expand non-native sub-expressions into 346 * lists of members. 347 */ 348 public transient final BooleanProperty ExpandNonNative = 349 new BooleanProperty( 350 this, "mondrian.native.ExpandNonNative", false); 351 352 /** 353 * <p>Property that defines 354 * whether to generate joins to filter out members in a snowflake 355 * dimension that do not have any children.</p> 356 * 357 * <p>If true (the default), some queries to query members of high 358 * levels snowflake dimensions will be more expensive. If false, and if 359 * there are rows in an outer snowflake table that are not referenced by 360 * a row in an inner snowflake table, then some queries will return members 361 * that have no children.</p> 362 * 363 * <p>Our recommendation, for best performance, is to remove rows outer 364 * snowflake tables are not referenced by any row in an inner snowflake 365 * table, during your ETL process, and to set this property to 366 * {@code false}.</p> 367 */ 368 public transient final BooleanProperty FilterChildlessSnowflakeMembers = 369 new BooleanProperty( 370 this, "mondrian.rolap.FilterChildlessSnowflakeMembers", true); 371 372 /** 373 * <p>Property containing the JDBC URL of the FoodMart database. 374 * The default value is to connect to an ODBC data source called 375 * "MondrianFoodMart".</p> 376 * 377 * <p>To run the test suite, first load the FoodMart data set into the 378 * database of your choice. Then set the driver.classpath, 379 * mondrian.foodmart.jdbcURL and mondrian.jdbcDrivers properties, by 380 * un-commenting and modifying one of the sections below. 381 * Put the JDBC driver jar into mondrian/testlib.</p> 382 * 383 * <p>Here are example property settings for various databases.</p> 384 * 385 * <h3>Derby: needs user and password</h3> 386 * <blockquote><code> 387 * mondrian.foodmart.jdbcURL=jdbc:derby:demo/derby/foodmart<br></br> 388 * mondrian.foodmart.jdbcUser=sa<br></br> 389 * mondrian.foodmart.jdbcPassword=sa<br></br> 390 * mondrian.jdbcDrivers=org.apache.derby.jdbc.EmbeddedDriver<br></br> 391 * driver.classpath=testlib/derby.jar</code></blockquote> 392 * 393 * <h3>FireBirdSQL</h3> 394 * <blockquote><code> 395 * mondrian.foodmart.jdbcURL=jdbc:firebirdsql:localhost/3050:/mondrian/foodmart.gdb<br></br> 396 * mondrian.jdbcDrivers=org.firebirdsql.jdbc.FBDriver<br></br> 397 * driver.classpath=/jdbc/fb/firebirdsql-full.jar</code></blockquote> 398 * 399 * <h3>Greenplum (similar to Postgres)</h3> 400 * <blockquote><code> 401 * mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/foodmart?user=gpadmin&password=xxxx<br></br> 402 * mondrian.foodmart.jdbcUser=foodmart<br></br> 403 * mondrian.foodmart.jdbcPassword=foodmart<br></br> 404 * mondrian.jdbcDrivers=org.postgresql.Driver<br></br> 405 * driver.classpath=lib/postgresql-8.2-504.jdbc3.jar</code></blockquote> 406 * 407 * <h3>LucidDB (see <a>instructions</a>)</h3> 408 * <blockquote><code> 409 * mondrian.foodmart.jdbcURL=jdbc:luciddb:http://localhost<br></br> 410 * mondrian.foodmart.jdbcUser=foodmart<br></br> 411 * mondrian.jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver<br></br> 412 * driver.classpath=/path/to/luciddb/plugin/LucidDbClient.jar</code></blockquote> 413 * 414 * <h3>Oracle (needs user and password)</h3> 415 * <blockquote><code> 416 * oracle.home=G:/oracle/product/10.1.0/Db_1<br></br> 417 * mondrian.foodmart.jdbcURL.oracle=jdbc:oracle:thin:@//<i>host</i>:<i>port</i>/<i>service_name</i><br></br> 418 * mondrian.foodmart.jdbcURL=jdbc:oracle:thin:foodmart/foodmart@//stilton:1521/orcl<br></br> 419 * mondrian.foodmart.jdbcURL=jdbc:oracle:oci8:foodmart/foodmart@orcl<br></br> 420 * mondrian.foodmart.jdbcUser=FOODMART<br></br> 421 * mondrian.foodmart.jdbcPassword=oracle<br></br> 422 * mondrian.jdbcDrivers=oracle.jdbc.OracleDriver<br></br> 423 * driver.classpath=/home/jhyde/open/mondrian/lib/ojdbc14.jar</code></blockquote> 424 * 425 * <h3>ODBC (Microsoft Access)</h3> 426 * <blockquote><code> 427 * mondrian.foodmart.jdbcURL=jdbc:odbc:MondrianFoodMart<br></br> 428 * mondrian.jdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver<br></br> 429 * driver.classpath=</code></blockquote> 430 * 431 * <h3> Hypersonic</h3> 432 * <blockquote><code> 433 * mondrian.foodmart.jdbcURL=jdbc:hsqldb:demo/hsql/FoodMart<br></br> 434 * mondrian.jdbcDrivers=org.hsqldb.jdbcDriver<br></br> 435 * driver.classpath=xx</code></blockquote> 436 * 437 * <h3> MySQL: can have user and password set in JDBC URL</h3> 438 * <blockquote><code> 439 * mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart<br></br> 440 * mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart<br></br> 441 * mondrian.foodmart.jdbcUser=foodmart<br></br> 442 * mondrian.foodmart.jdbcPassword=foodmart<br></br> 443 * mondrian.jdbcDrivers=com.mysql.jdbc.Driver<br></br> 444 * driver.classpath=D:/mysql-connector-3.1.12</code></blockquote> 445 * 446 * <h3>Infobright</h3> 447 * <p>As MySQL. (Infobright uses a MySQL driver, version 5.1 and later.)</p> 448 * 449 * <h3>Ingres</h3> 450 * <blockquote><code> 451 * mondrian.foodmart.jdbcURL=jdbc:ingres://192.168.200.129:II7/MondrianFoodMart;LOOP=on;AUTO=multi;UID=ingres;PWD=sergni<br></br> 452 * mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver<br></br> 453 * driver.classpath=c:/ingres2006/ingres/lib/iijdbc.jar</code></blockquote> 454 * 455 * <h3>Postgres: needs user and password</h3> 456 * <blockquote><code> 457 * mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/FM3<br></br> 458 * mondrian.foodmart.jdbcUser=postgres<br></br> 459 * mondrian.foodmart.jdbcPassword=pgAdmin<br></br> 460 * mondrian.jdbcDrivers=org.postgresql.Driver</code></blockquote> 461 * 462 * <h3>Neoview</h3> 463 * <blockquote><code> 464 * mondrian.foodmart.jdbcURL=jdbc:hpt4jdbc://localhost:18650/:schema=PENTAHO;serverDataSource=PENTAHO_DataSource<br></br> 465 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 466 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 467 * mondrian.jdbcDrivers=com.hp.t4jdbc.HPT4Driver<br></br> 468 * driver.classpath=/some/path/hpt4jdbc.jar</code></blockquote> 469 * 470 * <h3>Netezza: mimics Postgres</h3> 471 * <blockquote><code> 472 * mondrian.foodmart.jdbcURL=jdbc:netezza://127.0.1.10/foodmart<br></br> 473 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 474 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 475 * mondrian.jdbcDrivers=org.netezza.Driver<br></br> 476 * driver.classpath=/some/path/nzjdbc.jar</code></blockquote> 477 * 478 * <h3>Sybase</h3> 479 * <blockquote><code> 480 * mondrian.foodmart.jdbcURL=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:<i>port</i>/<i>dbName</i><br></br> 481 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 482 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 483 * mondrian.jdbcDrivers=net.sourceforge.jtds.jdbc.Driver<br></br> 484 * driver.classpath=/some/path/jtds-1.2.jar</code></blockquote> 485 * 486 * <h3>Teradata</h3> 487 * <blockquote><code> 488 * mondrian.foodmart.jdbcURL=jdbc:teradata://DatabaseServerName/DATABASE=FoodMart<br></br> 489 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 490 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 491 * mondrian.jdbcDrivers=com.ncr.teradata.TeraDriver<br></br> 492 * driver.classpath=/some/path/terajdbc/classes/terajdbc4.jar</code></blockquote> 493 * 494 * <h3>Vertica</h3> 495 * <blockquote><code> 496 * mondrian.foodmart.jdbcURL=jdbc:vertica://xxx.xxx.xxx.xxx:<i>port</i>/<i>dbName</i><br></br> 497 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 498 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 499 * mondrian.jdbcDrivers=com.vertica.Driver<br></br> 500 * driver.classpath=/some/path/vertica.jar</code></blockquote> 501 * 502 * <h3>Vectorwise</h3> 503 * <blockquote><code> 504 * mondrian.foodmart.jdbcURL=jdbc:ingres://xxx.xxx.xxx.xxx<i>port</i>/<i>dbName</i><br></br> 505 * mondrian.foodmart.jdbcUser=<i>user</i><br></br> 506 * mondrian.foodmart.jdbcPassword=<i>password</i><br></br> 507 * mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver <br></br> 508 * driver.classpath=/some/path/iijdbc.jar</code></blockquote> 509 */ 510 public transient final StringProperty FoodmartJdbcURL = 511 new StringProperty( 512 this, "mondrian.foodmart.jdbcURL", "jdbc:odbc:MondrianFoodMart"); 513 514 /** 515 * <p>Boolean property that controls whether to print the SQL code 516 * generated for aggregate tables.</p> 517 * 518 * <p>If set, then as each aggregate request is processed, both the lost 519 * and collapsed dimension create and insert sql code is printed. 520 * This is for use in the CmdRunner allowing one to create aggregate table 521 * generation sql.</p> 522 */ 523 public transient final BooleanProperty GenerateAggregateSql = 524 new BooleanProperty( 525 this, "mondrian.rolap.aggregates.generateSql", false); 526 527 /** 528 * <p>Boolean property that controls pretty-print mode.</p> 529 * 530 * <p>If true, the all SqlQuery SQL strings will be generated in 531 * pretty-print mode, formatted for ease of reading.</p> 532 */ 533 public transient final BooleanProperty GenerateFormattedSql = 534 new BooleanProperty( 535 this, "mondrian.rolap.generate.formatted.sql", false); 536 537 /** 538 * Property that establishes the amount of chunks for querying cells 539 * involving high-cardinality dimensions. 540 * Should prime with {@link #ResultLimit mondrian.result.limit}. 541 */ 542 public transient final IntegerProperty HighCardChunkSize = 543 new IntegerProperty( 544 this, "mondrian.result.highCardChunkSize", 1); 545 546 /** 547 * <p>Property that defines whether non-existent member errors should be 548 * ignored during schema load. If so, the non-existent member is treated 549 * as a null member.</p> 550 */ 551 public transient final BooleanProperty IgnoreInvalidMembers = 552 new BooleanProperty( 553 this, "mondrian.rolap.ignoreInvalidMembers", false); 554 555 /** 556 * <p>Property that defines whether non-existent member errors should be 557 * ignored during query validation. If so, the non-existent member is 558 * treated as a null member.</p> 559 */ 560 public transient final BooleanProperty IgnoreInvalidMembersDuringQuery = 561 new BooleanProperty( 562 this, "mondrian.rolap.ignoreInvalidMembersDuringQuery", false); 563 564 /** 565 * <p>Property that defines whether to ignore measure when non joining 566 * dimension is in the tuple during aggregation.</p> 567 * 568 * <p>If there are unrelated dimensions to a measure in context during 569 * aggregation, the measure is ignored in the evaluation context. This 570 * behaviour kicks in only if the CubeUsage for this measure has 571 * IgnoreUnrelatedDimensions attribute set to false.</p> 572 * 573 * <p>For example, Gender doesn't join with [Warehouse Sales] measure.</p> 574 * 575 * <p>With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=true 576 * Warehouse Sales gets eliminated and is ignored in the aggregate 577 * value.</p> 578 * 579 * <blockquote><code> [Store Sales] + [Warehouse Sales] 580 * SUM({Product.members * Gender.members}) 7,913,333.82</code></blockquote> 581 * 582 * <p>With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=false 583 * Warehouse Sales with Gender All level member contributes to the aggregate 584 * value.</p> 585 * 586 * <blockquote><code> [Store Sales] + [Warehouse Sales] 587 * SUM({Product.members * Gender.members}) 9,290,730.03</code></blockquote> 588 * 589 * <p>On a report where Gender M, F and All members exist a user will see a 590 * large aggregated value compared to the aggregated value that can be 591 * arrived at by summing up values against Gender M and F. This can be 592 * confusing to the user. This feature can be used to eliminate such a 593 * situation.</p> 594 */ 595 public transient final BooleanProperty IgnoreMeasureForNonJoiningDimension = 596 new BooleanProperty( 597 this, "mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension", false); 598 599 /** 600 * <p>Integer property indicating the maximum number of iterations 601 * allowed when iterating over members to compute aggregates. A value of 602 * 0 (the default) indicates no limit.</p> 603 */ 604 public transient final IntegerProperty IterationLimit = 605 new IntegerProperty( 606 this, "mondrian.rolap.iterationLimit", 0); 607 608 /** 609 * Not documented. 610 */ 611 public transient final IntegerProperty Iterations = 612 new IntegerProperty( 613 this, "mondrian.test.Iterations", 1); 614 615 /** 616 * Property containing a list of JDBC drivers to load automatically. 617 * Must be a comma-separated list of class names, and the classes must be 618 * on the class path. 619 */ 620 public transient final StringProperty JdbcDrivers = 621 new StringProperty( 622 this, "mondrian.jdbcDrivers", "sun.jdbc.odbc.JdbcOdbcDriver,org.hsqldb.jdbcDriver,oracle.jdbc.OracleDriver,com.mysql.jdbc.Driver"); 623 624 /** 625 * <p>Property that defines the JdbcSchema factory class which 626 * determines the list of tables and columns of a specific datasource.</p> 627 * 628 * @see mondrian.rolap.aggmatcher.JdbcSchema 629 */ 630 public transient final StringProperty JdbcFactoryClass = 631 new StringProperty( 632 this, "mondrian.rolap.aggregates.jdbcFactoryClass", null); 633 634 /** 635 * <p>String property that holds the 636 * name of the class whose resource bundle is to be used to for this 637 * schema. For example, if the class is {@code com.acme.MyResource}, 638 * mondrian will look for a resource bundle called 639 * {@code com/acme/MyResource_<i>locale</i>.properties} on the class path. 640 * (This property has a confusing name because in a previous release it 641 * actually held a file name.)</p> 642 * 643 * <p>Used for the {@link mondrian.i18n.LocalizingDynamicSchemaProcessor}; 644 * see <a>Internationalization</a> 645 * for more details.</p> 646 * 647 * <p>Default value is null.</p> 648 */ 649 public transient final StringProperty LocalePropFile = 650 new StringProperty( 651 this, "mondrian.rolap.localePropFile", null); 652 653 /** 654 * <p>Max number of constraints in a single 'IN' SQL clause.</p> 655 * 656 * <p>This value may be variant among database products and their runtime 657 * settings. Oracle, for example, gives the error "ORA-01795: maximum 658 * number of expressions in a list is 1000".</p> 659 * 660 * <p>Recommended values:</p> 661 * <ul> 662 * <li>Oracle: 1,000</li> 663 * <li>DB2: 2,500</li> 664 * <li>Other: 10,000</li> 665 * </ul> 666 */ 667 public transient final IntegerProperty MaxConstraints = 668 new IntegerProperty( 669 this, "mondrian.rolap.maxConstraints", 1000); 670 671 /** 672 * <p>Boolean property that defines the maximum number of passes 673 * allowable while evaluating an MDX expression.</p> 674 * 675 * <p>If evaluation exceeds this depth (for example, while evaluating a 676 * very complex calculated member), Mondrian will throw an error.</p> 677 */ 678 public transient final IntegerProperty MaxEvalDepth = 679 new IntegerProperty( 680 this, "mondrian.rolap.evaluate.MaxEvalDepth", 10); 681 682 /** 683 * Property that defines 684 * limit on the number of rows returned by XML/A drill through request. 685 */ 686 public transient final IntegerProperty MaxRows = 687 new IntegerProperty( 688 this, "mondrian.xmla.drillthroughMaxRows", 1000); 689 690 /** 691 * <p>Property that defines whether the <code>MemoryMonitor</code> should 692 * be enabled. By default it is disabled; memory monitor is not available 693 * before Java version 1.5.</p> 694 */ 695 public transient final BooleanProperty MemoryMonitor = 696 new BooleanProperty( 697 this, "mondrian.util.memoryMonitor.enable", false); 698 699 /** 700 * <p>Property that defines 701 * the name of the class used as a memory monitor.</p> 702 * 703 * <p>If the value is 704 * non-null, it is used by the <code>MemoryMonitorFactory</code> 705 * to create the implementation.</p> 706 */ 707 public transient final StringProperty MemoryMonitorClass = 708 new StringProperty( 709 this, "mondrian.util.MemoryMonitor.class", null); 710 711 /** 712 * <p>Property that defines the default <code>MemoryMonitor</code> 713 * percentage threshold. If enabled, when Java's memory monitor detects 714 * that post-garbage collection is above this value, notifications are 715 * generated.</p> 716 */ 717 public transient final IntegerProperty MemoryMonitorThreshold = 718 new IntegerProperty( 719 this, "mondrian.util.memoryMonitor.percentage.threshold", 90); 720 721 /** 722 * <p>Property that controls the maximum number of results contained in a 723 * NativizeSet result set.</p> 724 * 725 * <p>If the number of tuples contained in the result set exceeds this 726 * value Mondrian throws a LimitExceededDuringCrossjoin error.</p> 727 */ 728 public transient final IntegerProperty NativizeMaxResults = 729 new IntegerProperty( 730 this, "mondrian.native.NativizeMaxResults", 150000); 731 732 /** 733 * <p>Property that controls minimum expected cardinality required in 734 * order for NativizeSet to natively evaluate a query.</p> 735 * 736 * <p>If the expected cardinality falls below this level the query is 737 * executed non-natively.</p> 738 * 739 * <p>It is possible for the actual cardinality to fall below this 740 * threshold even though the expected cardinality falls above this 741 * threshold. In this case the query will be natively evaluated.</p> 742 */ 743 public transient final IntegerProperty NativizeMinThreshold = 744 new IntegerProperty( 745 this, "mondrian.native.NativizeMinThreshold", 100000); 746 747 /** 748 * <p>Property determines if elements of dimension (levels, hierarchies, 749 * members) need to be prefixed with dimension name in MDX query.</p> 750 * 751 * <p>For example when the property is true, the following queries 752 * will error out. The same queries will work when this property 753 * is set to false.</p> 754 * 755 * <blockquote><code>select {[M]} on 0 from sales<br></br> 756 * select {[USA]} on 0 from sales<br></br> 757 * select {[USA].[CA].[Santa Monica]} on 0 from sales</code></blockquote> 758 * 759 * <p>When the property is set to true, any query where elements are 760 * prefixed with dimension name as below will work</p> 761 * 762 * <blockquote><code>select {[Gender].[F]} on 0 from sales<br></br> 763 * select {[Customers].[Santa Monica]} on 0 from sales</code></blockquote> 764 * 765 * <p>Please note that this property does not govern the behaviour 766 * wherein</p> 767 * 768 * <blockquote><code>[Gender].[M]</code></blockquote> 769 * 770 * <p>is resolved into a fully qualified</p> 771 * 772 * <blockquote><code>[Gender].[M]</code></blockquote> 773 * 774 * <p> In a scenario where the schema is very large and dimensions have 775 * large number of members a MDX query that has a invalid member in it will 776 * cause mondrian to to go through all the dimensions, levels, hierarchies, 777 * members and properties trying to resolve the element name. This behavior 778 * consumes considerable time and resources on the server. Setting this 779 * property to true will make it fail fast in a scenario where it is 780 * desirable.</p> 781 */ 782 public transient final BooleanProperty NeedDimensionPrefix = 783 new BooleanProperty( 784 this, "mondrian.olap.elements.NeedDimensionPrefix", false); 785 786 /** 787 * <p>Property that defines 788 * the behavior of division if the denominator evaluates to zero.</p> 789 * 790 * <p>If false (the default), if a division has a non-null numerator and 791 * a null denominator, it evaluates to "Infinity", which conforms to SSAS 792 * behavior.</p> 793 * 794 * <p>If true, the result is null if the denominator is null. Setting to 795 * true enables the old semantics of evaluating this to null; this does 796 * not conform to SSAS, but is useful in some applications.</p> 797 */ 798 public transient final BooleanProperty NullDenominatorProducesNull = 799 new BooleanProperty( 800 this, "mondrian.olap.NullDenominatorProducesNull", false); 801 802 /** 803 * <p>Property that determines how a null member value is represented in the 804 * result output.</p> 805 * <p>AS 2000 shows this as empty value</p> 806 * <p>AS 2005 shows this as "(null)" value</p> 807 */ 808 public transient final StringProperty NullMemberRepresentation = 809 new StringProperty( 810 this, "mondrian.olap.NullMemberRepresentation", "#null"); 811 812 /** 813 * <p>Boolean property that determines whether Mondrian optimizes predicates.</p> 814 * 815 * <p>If true, Mondrian may retrieve a little more data than specified in 816 * MDX query and cache it for future use. For example, if you ask for 817 * data on 48 states of the United States for 3 quarters of 2011, 818 * Mondrian will round out to all 50 states and all 4 quarters. If 819 * false, Mondrian still optimizes queries that involve all members of a 820 * dimension.</p> 821 */ 822 public transient final BooleanProperty OptimizePredicates = 823 new BooleanProperty( 824 this, "mondrian.rolap.aggregates.optimizePredicates", true); 825 826 /** 827 * <p>Property that defines the name of the factory class used 828 * to create maps of member properties to their respective values.</p> 829 * 830 * <p>If the value is 831 * non-null, it is used by the <code>PropertyValueFactory</code> 832 * to create the implementation. If unset, 833 * {@link mondrian.rolap.RolapMemberBase.DefaultPropertyValueMapFactory} 834 * will be used.</p> 835 */ 836 public transient final StringProperty PropertyValueMapFactoryClass = 837 new StringProperty( 838 this, "mondrian.rolap.RolapMember.PropertyValueMapFactory.class", null); 839 840 /** 841 * Property defining 842 * where the test XML files are. 843 */ 844 public transient final StringProperty QueryFileDirectory = 845 new StringProperty( 846 this, "mondrian.test.QueryFileDirectory", null); 847 848 /** 849 * Property that defines 850 * a pattern for which test XML files to run. Pattern has to 851 * match a file name of the form: 852 * <code>query<i>whatever</i>.xml</code> in the directory. 853 * 854 * <p>Example:</p> 855 * 856 * <blockquote><code> 857 * mondrian.test.QueryFilePattern=queryTest_fec[A-Za-z0-9_]*.xml 858 * </code></blockquote> 859 */ 860 public transient final StringProperty QueryFilePattern = 861 new StringProperty( 862 this, "mondrian.test.QueryFilePattern", null); 863 864 /** 865 * <p>Maximum number of simultaneous queries the system will allow.</p> 866 * 867 * <p>Oracle fails if you try to run more than the 'processes' parameter in 868 * init.ora, typically 150. The throughput of Oracle and other databases 869 * will probably reduce long before you get to their limit.</p> 870 */ 871 public transient final IntegerProperty QueryLimit = 872 new IntegerProperty( 873 this, "mondrian.query.limit", 40); 874 875 /** 876 * <p>Property that defines the timeout value (in seconds) for queries. A 877 * value of 0 (the default) indicates no timeout.</p> 878 */ 879 public transient final IntegerProperty QueryTimeout = 880 new IntegerProperty( 881 this, "mondrian.rolap.queryTimeout", 0); 882 883 /** 884 * <p>Boolean property that determines whether Mondrian should read 885 * aggregate tables.</p> 886 * 887 * <p>If set to true, then Mondrian scans the database for aggregate tables. 888 * Unless mondrian.rolap.aggregates.Use is set to true, the aggregates 889 * found will not be used.</p> 890 */ 891 public transient final BooleanProperty ReadAggregates = 892 new BooleanProperty( 893 this, "mondrian.rolap.aggregates.Read", false); 894 895 /** 896 * Integer property that, if set to a value greater than zero, limits the 897 * maximum size of a result set. 898 */ 899 public transient final IntegerProperty ResultLimit = 900 new IntegerProperty( 901 this, "mondrian.result.limit", 0); 902 903 /** 904 * <p>Maximum number of MDX query threads per Mondrian server instance. 905 * Defaults to 10.</p> 906 */ 907 public transient final IntegerProperty RolapConnectionShepherdNbThreads = 908 new IntegerProperty( 909 this, "mondrian.rolap.maxQueryThreads", 10); 910 911 /** 912 * <p>Property that defines the interval value between 913 * polling operations performed by the RolapConnection shepherd thread. 914 * This controls query timeouts and cancellation, so a small value 915 * (a few milliseconds) is best. Setting this to a value higher than 916 * mondrian.rolap.queryTimeout will result the timeout not being enforced 917 * as expected.</p> 918 * 919 * <p>Default value is "1000ms". Default time unit is "ms".</p> 920 */ 921 public transient final StringProperty RolapConnectionShepherdThreadPollingInterval = 922 new StringProperty( 923 this, "mondrian.rolap.shepherdThreadPollingInterval", "1000ms"); 924 925 /** 926 * Property which defines which SegmentCache implementation to use. 927 * Specify the value as a fully qualified class name, such as 928 * <code>org.example.SegmentCacheImpl</code> where SegmentCacheImpl 929 * is an implementation of {@link mondrian.spi.SegmentCache}. 930 */ 931 public transient final StringProperty SegmentCache = 932 new StringProperty( 933 this, "mondrian.rolap.SegmentCache", null); 934 935 /** 936 * <p>Maximum number of threads per Mondrian server instance that 937 * are used to run perform operations on the external caches. 938 * Defaults to 100.</p> 939 */ 940 public transient final IntegerProperty SegmentCacheManagerNumberCacheThreads = 941 new IntegerProperty( 942 this, "mondrian.rolap.maxCacheThreads", 100); 943 944 /** 945 * <p>Maximum number of threads per Mondrian server instance that 946 * are used to run SQL queries when populating segments. 947 * Defaults to 100.</p> 948 */ 949 public transient final IntegerProperty SegmentCacheManagerNumberSqlThreads = 950 new IntegerProperty( 951 this, "mondrian.rolap.maxSqlThreads", 100); 952 953 /** 954 * Property that controls the behavior of 955 * {@link Property#SOLVE_ORDER solve order} of calculated members and sets. 956 * 957 * <p>Valid values are "absolute" and "scoped" (the default). See 958 * {@link mondrian.olap.SolveOrderMode} for details.</p> 959 */ 960 public transient final StringProperty SolveOrderMode = 961 new StringProperty( 962 this, "mondrian.rolap.SolveOrderMode", "ABSOLUTE"); 963 964 /** 965 * <p>Property that, with {@link #SparseSegmentDensityThreshold}, determines 966 * whether to choose a sparse or dense representation when storing 967 * collections of cell values in memory.</p> 968 * 969 * <p>When storing collections of cell values, Mondrian has to choose 970 * between a sparse and a dense representation, based upon the 971 * <code>possible</code> and <code>actual</code> number of values. 972 * The <code>density</code> is <code>actual / possible</code>.</p> 973 * 974 * <p>We use a sparse representation if 975 * <code>(possible - 976 * {@link #SparseSegmentCountThreshold countThreshold}) * 977 * {@link #SparseSegmentDensityThreshold densityThreshold} > 978 * actual</code></p> 979 * 980 * <p>For example, at the default values 981 * ({@link #SparseSegmentCountThreshold countThreshold} = 1000, 982 * {@link #SparseSegmentDensityThreshold} = 0.5), 983 * we use a dense representation for</p> 984 * 985 * <ul> 986 * <li>(1000 possible, 0 actual), or</li> 987 * <li>(2000 possible, 500 actual), or</li> 988 * <li>(3000 possible, 1000 actual).</li> 989 * </ul> 990 * 991 * <p>Any fewer actual values, or any more 992 * possible values, and Mondrian will use a sparse representation.</p> 993 */ 994 public transient final IntegerProperty SparseSegmentCountThreshold = 995 new IntegerProperty( 996 this, "mondrian.rolap.SparseSegmentValueThreshold", 1000); 997 998 /** 999 * Property that, with {@link #SparseSegmentCountThreshold}, 1000 * determines whether to choose a sparse or dense representation when 1001 * storing collections of cell values in memory. 1002 */ 1003 public transient final DoubleProperty SparseSegmentDensityThreshold = 1004 new DoubleProperty( 1005 this, "mondrian.rolap.SparseSegmentDensityThreshold", 0.5); 1006 1007 /** 1008 * <p>Property that defines the name of the class used in SqlMemberSource 1009 * to pool common values.</p> 1010 * 1011 * <p>If the value is non-null, it is used by the 1012 * <code>SqlMemberSource.ValueMapFactory</code> 1013 * to create the implementation. If it is not set, then 1014 * {@link mondrian.rolap.SqlMemberSource.NullValuePoolFactory} 1015 * will be used, meaning common values will not be pooled.</p> 1016 */ 1017 public transient final StringProperty SqlMemberSourceValuePoolFactoryClass = 1018 new StringProperty( 1019 this, "mondrian.rolap.SqlMemberSource.ValuePoolFactory.class", null); 1020 1021 /** 1022 * <p>Property that defines 1023 * whether to enable new naming behavior.</p> 1024 * 1025 * <p>If true, hierarchies are named [Dimension].[Hierarchy]; if false, 1026 * [Dimension.Hierarchy].</p> 1027 */ 1028 public transient final BooleanProperty SsasCompatibleNaming = 1029 new BooleanProperty( 1030 this, "mondrian.olap.SsasCompatibleNaming", false); 1031 1032 /** 1033 * <p>Comma-separated list of classes to be used to get statistics about the 1034 * number of rows in a table, or the number of distinct values in a column.</p> 1035 * 1036 * <p>If there is a value for mondrian.statistics.providers.DATABASE, where 1037 * DAtABASE is the current database name (e.g. MYSQL or ORACLE), then that 1038 * property overrides.</p> 1039 * 1040 * <p>Example:</p> 1041 * 1042 * <blockquote><code> 1043 * mondrian.statistics.providers=mondrian.spi.impl.JdbcStatisticsProvider<br></br> 1044 * mondrian.statistics.providers.MYSQL=mondrian.spi.impl.JdbcStatisticsProvider,mondrian.spi.impl.JdbcStatisticsProvider</code></blockquote> 1045 * 1046 * <p>This would use JDBC's statistics (via the 1047 * java.sql.DatabaseMetaData.getIndexInfo method) for most 1048 * databases, but for connections to a MySQL database, would use 1049 * external statistics first, and fall back to JDBC statistics 1050 * only if external statistics were not available.</p> 1051 */ 1052 public transient final StringProperty StatisticsProviders = 1053 new StringProperty( 1054 this, "mondrian.statistics.providers", null); 1055 1056 /** 1057 * <p>String property that determines which test class to run.</p> 1058 * 1059 * <p>This is the name of the class. It must either implement 1060 * {@code junit.framework.Test} or have a method 1061 * {@code public [static] junit.framework.Test suite()}.</p> 1062 * 1063 * <p>Example:</p> 1064 * 1065 * <blockquote><code>mondrian.test.Class=mondrian.test.FoodMartTestCase</code></blockquote> 1066 * 1067 * @see #TestName 1068 */ 1069 public transient final StringProperty TestClass = 1070 new StringProperty( 1071 this, "mondrian.test.Class", null); 1072 1073 /** 1074 * <p>Property containing the connect string which regression tests should 1075 * use to connect to the database.</p> 1076 * 1077 * <p>Format is specified in {@link Util#parseConnectString(String)}.</p> 1078 */ 1079 public transient final StringProperty TestConnectString = 1080 new StringProperty( 1081 this, "mondrian.test.connectString", null); 1082 1083 /** 1084 * <p>Integer property that controls whether to test operators' 1085 * dependencies, and how much time to spend doing it.</p> 1086 * 1087 * <p>If this property is positive, Mondrian's test framework allocates an 1088 * expression evaluator which evaluates each expression several times, and 1089 * makes sure that the results of the expression are independent of 1090 * dimensions which the expression claims to be independent of.</p> 1091 * 1092 * <p>The default is 0.</p> 1093 */ 1094 public transient final IntegerProperty TestExpDependencies = 1095 new IntegerProperty( 1096 this, "mondrian.test.ExpDependencies", 0); 1097 1098 /** 1099 * Property containing a list of dimensions in the Sales cube that should 1100 * be treated as high-cardinality dimensions by the testing infrastructure. 1101 * This allows us to run the full suite of tests with high-cardinality 1102 * functionality enabled. 1103 */ 1104 public transient final StringProperty TestHighCardinalityDimensionList = 1105 new StringProperty( 1106 this, "mondrian.test.highCardDimensions", null); 1107 1108 /** 1109 * Property containing the JDBC password of a test database. 1110 * The default value is null, to cope with DBMSs that don't need this. 1111 */ 1112 public transient final StringProperty TestJdbcPassword = 1113 new StringProperty( 1114 this, "mondrian.foodmart.jdbcPassword", null); 1115 1116 /** 1117 * Property containing the JDBC user of a test database. 1118 * The default value is null, to cope with DBMSs that don't need this. 1119 */ 1120 public transient final StringProperty TestJdbcUser = 1121 new StringProperty( 1122 this, "mondrian.foodmart.jdbcUser", null); 1123 1124 /** 1125 * <p>String property that determines which tests are run.</p> 1126 * 1127 * <p>This is a regular expression as defined by 1128 * {@link java.util.regex.Pattern}. 1129 * If this property is specified, only tests whose names match the pattern 1130 * in its entirety will be run.</p> 1131 * 1132 * @see #TestClass 1133 */ 1134 public transient final StringProperty TestName = 1135 new StringProperty( 1136 this, "mondrian.test.Name", null); 1137 1138 /** 1139 * <p>Seed for random number generator used by some of the tests.</p> 1140 * 1141 * <p>Any value besides 0 or -1 gives deterministic behavior. 1142 * The default value is 1234: most users should use this. 1143 * Setting the seed to a different value can increase coverage, and 1144 * therefore may uncover new bugs.</p> 1145 * 1146 * <p>If you set the value to 0, the system will generate its own 1147 * pseudo-random seed.</p> 1148 * 1149 * <p>If you set the value to -1, Mondrian uses the next seed from an 1150 * internal random-number generator. This is a little more deterministic 1151 * than setting the value to 0.</p> 1152 */ 1153 public transient final IntegerProperty TestSeed = 1154 new IntegerProperty( 1155 this, "mondrian.test.random.seed", 1234); 1156 1157 /** 1158 * Property that returns the time limit for the test run in seconds. 1159 * If the test is running after that time, it is terminated. 1160 */ 1161 public transient final IntegerProperty TimeLimit = 1162 new IntegerProperty( 1163 this, "mondrian.test.TimeLimit", 0); 1164 1165 /** 1166 * <p>Boolean property that controls whether Mondrian uses aggregate 1167 * tables.</p> 1168 * 1169 * <p>If true, then Mondrian uses aggregate tables. This property is 1170 * queried prior to each aggregate query so that changing the value of this 1171 * property dynamically (not just at startup) is meaningful.</p> 1172 * 1173 * <p>Aggregates can be read from the database using the 1174 * {@link #ReadAggregates} property but will not be used unless this 1175 * property is set to true.</p> 1176 */ 1177 public transient final BooleanProperty UseAggregates = 1178 new BooleanProperty( 1179 this, "mondrian.rolap.aggregates.Use", false); 1180 1181 /** 1182 * Not documented. 1183 */ 1184 public transient final IntegerProperty VUsers = 1185 new IntegerProperty( 1186 this, "mondrian.test.VUsers", 1); 1187 1188 /** 1189 * Property that indicates whether this is a "warmup test". 1190 */ 1191 public transient final BooleanProperty Warmup = 1192 new BooleanProperty( 1193 this, "mondrian.test.Warmup", false); 1194 1195 /** 1196 * <p>Property that controls whether warning messages should be printed if a SQL 1197 * comparison test does not contain expected SQL statements for the specified 1198 * dialect. The tests are skipped if no expected SQL statements are 1199 * found for the current dialect.</p> 1200 * 1201 * <p>Possible values are the following:</p> 1202 * 1203 * <ul> 1204 * <li>"NONE": no warning (default)</li> 1205 * <li>"ANY": any dialect</li> 1206 * <li>"ACCESS"</li> 1207 * <li>"DERBY"</li> 1208 * <li>"LUCIDDB"</li> 1209 * <li>"MYSQL"</li> 1210 * <li>... and any Dialect enum in SqlPattern.Dialect</li> 1211 * </ul> 1212 * 1213 * <p>Specific tests can overwrite the default setting. The priority is:<ul> 1214 * <li>Settings besides "ANY" in mondrian.properties file</li> 1215 * <li>< Any setting in the test</li> 1216 * <li>< "ANY"</li> 1217 * </ul> 1218 * </p> 1219 */ 1220 public transient final StringProperty WarnIfNoPatternForDialect = 1221 new StringProperty( 1222 this, "mondrian.test.WarnIfNoPatternForDialect", "NONE"); 1223 1224 /** 1225 * <p>Interval at which to refresh the 1226 * list of XML/A catalogs. (Usually known as the 1227 * datasources.xml file.)</p> 1228 * 1229 * <p>It is not an active process; no threads will be created. It only 1230 * serves as a rate limiter. The refresh process is triggered by requests 1231 * to the doPost() servlet method.</p> 1232 * 1233 * <p>Values may have time unit suffixes such as 's' (second) or 'ms' 1234 * (milliseconds). Default value is 3000 milliseconds (3 seconds). 1235 * Default time unit is milliseconds.</p> 1236 * 1237 * <p>See also 1238 * {@link mondrian.xmla.impl.DynamicDatasourceXmlaServlet}.</p> 1239 */ 1240 public transient final StringProperty XmlaSchemaRefreshInterval = 1241 new StringProperty( 1242 this, "mondrian.xmla.SchemaRefreshInterval", "3000ms"); 1243 1244} 1245 1246// End MondrianProperties.java