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&amp;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&amp;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} &gt;
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>&lt; Any setting in the test</li>
1216     * <li>&lt; "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