<!--
  == This software is subject to the terms of the Eclipse Public License v1.0
  == Agreement, available at the following URL:
  == http://www.eclipse.org/legal/epl-v10.html.
  == You must accept the terms of that agreement to use this software.
  ==
  == Copyright (C) 2011-2012 Pentaho
  == All Rights Reserved.
  ==
  == Definitions of configuration properties used by Mondrian. From this file,
  == PropertyUtil generates MondrianProperties.java,
  == mondrian.properties.template, and doc/properties.html (which is included in
  == configuration.html).
  -->
<PropertyDefinitions>
    <PropertyDefinition>
        <Name>QueryLimit</Name>
        <Path>mondrian.query.limit</Path>
        <Description>
<p>Maximum number of simultaneous queries the system will allow.</p>

<p>Oracle fails if you try to run more than the 'processes' parameter in
init.ora, typically 150. The throughput of Oracle and other databases
will probably reduce long before you get to their limit.</p>
</Description>
        <Type>int</Type>
        <Default>40</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>JdbcDrivers</Name>
        <Path>mondrian.jdbcDrivers</Path>
        <Description>
Property containing a list of JDBC drivers to load automatically.
Must be a comma-separated list of class names, and the classes must be
on the class path.
        </Description>
        <Type>String</Type>
        <Default>sun.jdbc.odbc.JdbcOdbcDriver,org.hsqldb.jdbcDriver,oracle.jdbc.OracleDriver,com.mysql.jdbc.Driver</Default>
    </PropertyDefinition>
	<PropertyDefinition>
        <Name>CellBatchSize</Name>
        <Path>mondrian.rolap.cellBatchSize</Path>
        <Description>
Integer property that, if set to a value greater than zero, sets a hard limit on the
number of cells that are batched together when building segments.
</Description>
        <Type>int</Type>
        <Default>-1</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ResultLimit</Name>
        <Path>mondrian.result.limit</Path>
        <Description>
Integer property that, if set to a value greater than zero, limits the
maximum size of a result set.
</Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>HighCardChunkSize</Name>
        <Path>mondrian.result.highCardChunkSize</Path>
        <Description>
Property that establishes the amount of chunks for querying cells
involving high-cardinality dimensions.
Should prime with {@link #ResultLimit mondrian.result.limit}.
        </Description>
        <Type>int</Type>
        <Default>1</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestName</Name>
        <Path>mondrian.test.Name</Path>
        <Category>Testing</Category>
        <Description>
<p>String property that determines which tests are run.</p>

<p>This is a regular expression as defined by
{@link java.util.regex.Pattern}.
If this property is specified, only tests whose names match the pattern
in its entirety will be run.</p>

@see #TestClass
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestClass</Name>
        <Path>mondrian.test.Class</Path>
        <Category>Testing</Category>
        <Description>
<p>String property that determines which test class to run.</p>

<p>This is the name of the class. It must either implement
{@code junit.framework.Test} or have a method
{@code public [static] junit.framework.Test suite()}.</p>

<p>Example:</p>

<blockquote><code>mondrian.test.Class=mondrian.test.FoodMartTestCase</code></blockquote>

@see #TestName
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestConnectString</Name>
        <Path>mondrian.test.connectString</Path>
        <Category>Testing</Category>
        <Description>
<p>Property containing the connect string which regression tests should
use to connect to the database.</p>

<p>Format is specified in {@link Util#parseConnectString(String)}.</p>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestHighCardinalityDimensionList</Name>
        <Path>mondrian.test.highCardDimensions</Path>
        <Description>
Property containing a list of dimensions in the Sales cube that should
be treated as high-cardinality dimensions by the testing infrastructure.
This allows us to run the full suite of tests with high-cardinality
functionality enabled.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>FoodmartJdbcURL</Name>
        <Path>mondrian.foodmart.jdbcURL</Path>
        <Category>Testing</Category>
        <Description>
<p>Property containing the JDBC URL of the FoodMart database.
The default value is to connect to an ODBC data source called
"MondrianFoodMart".</p>

<p>To run the test suite, first load the FoodMart data set into the
database of your choice. Then set the driver.classpath,
mondrian.foodmart.jdbcURL and mondrian.jdbcDrivers properties, by
un-commenting and modifying one of the sections below.
Put the JDBC driver jar into mondrian/testlib.</p>

<p>Here are example property settings for various databases.</p>

<h3>Derby: needs user and password</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:derby:demo/derby/foodmart<br/>
mondrian.foodmart.jdbcUser=sa<br/>
mondrian.foodmart.jdbcPassword=sa<br/>
mondrian.jdbcDrivers=org.apache.derby.jdbc.EmbeddedDriver<br/>
driver.classpath=testlib/derby.jar</code></blockquote>

<h3>FireBirdSQL</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:firebirdsql:localhost/3050:/mondrian/foodmart.gdb<br/>
mondrian.jdbcDrivers=org.firebirdsql.jdbc.FBDriver<br/>
driver.classpath=/jdbc/fb/firebirdsql-full.jar</code></blockquote>

<h3>Greenplum (similar to Postgres)</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/foodmart?user=gpadmin&amp;password=xxxx<br/>
mondrian.foodmart.jdbcUser=foodmart<br/>
mondrian.foodmart.jdbcPassword=foodmart<br/>
mondrian.jdbcDrivers=org.postgresql.Driver<br/>
driver.classpath=lib/postgresql-8.2-504.jdbc3.jar</code></blockquote>

<h3>LucidDB (see <a href="http://docs.eigenbase.org/LucidDbOlap">instructions</a>)</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:luciddb:http://localhost<br/>
mondrian.foodmart.jdbcUser=foodmart<br/>
mondrian.jdbcDrivers=org.luciddb.jdbc.LucidDbClientDriver<br/>
driver.classpath=/path/to/luciddb/plugin/LucidDbClient.jar</code></blockquote>

<h3>Oracle (needs user and password)</h3>
<blockquote><code>
oracle.home=G:/oracle/product/10.1.0/Db_1<br/>
mondrian.foodmart.jdbcURL.oracle=jdbc:oracle:thin:@//<i>host</i>:<i>port</i>/<i>service_name</i><br/>
mondrian.foodmart.jdbcURL=jdbc:oracle:thin:foodmart/foodmart@//stilton:1521/orcl<br/>
mondrian.foodmart.jdbcURL=jdbc:oracle:oci8:foodmart/foodmart@orcl<br/>
mondrian.foodmart.jdbcUser=FOODMART<br/>
mondrian.foodmart.jdbcPassword=oracle<br/>
mondrian.jdbcDrivers=oracle.jdbc.OracleDriver<br/>
driver.classpath=/home/jhyde/open/mondrian/lib/ojdbc14.jar</code></blockquote>

<h3>ODBC (Microsoft Access)</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:odbc:MondrianFoodMart<br/>
mondrian.jdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver<br/>
driver.classpath=</code></blockquote>

<h3> Hypersonic</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:hsqldb:demo/hsql/FoodMart<br/>
mondrian.jdbcDrivers=org.hsqldb.jdbcDriver<br/>
driver.classpath=xx</code></blockquote>

<h3> MySQL: can have user and password set in JDBC URL</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&amp;password=foodmart<br/>
mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart<br/>
mondrian.foodmart.jdbcUser=foodmart<br/>
mondrian.foodmart.jdbcPassword=foodmart<br/>
mondrian.jdbcDrivers=com.mysql.jdbc.Driver<br/>
driver.classpath=D:/mysql-connector-3.1.12</code></blockquote>

<h3> NuoDB</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:com.nuodb://localhost/foodmart?schema=mondrian<br/>
mondrian.foodmart.jdbcUser=foodmart<br/>
mondrian.foodmart.jdbcPassword=foodmart<br/>
mondrian.jdbcDrivers=com.nuodb.jdbc.Driver<br/>
mondrian.foodmart.jdbcSchema=mondrian<br/>
driver.classpath=/opt/nuodb/jar/nuodbjdbc.jar</code></blockquote>

<h3>Infobright</h3>
<p>As MySQL. (Infobright uses a MySQL driver, version 5.1 and later.)</p>

<h3>Ingres</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:ingres://192.168.200.129:II7/MondrianFoodMart;LOOP=on;AUTO=multi;UID=ingres;PWD=sergni<br/>
mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver<br/>
driver.classpath=c:/ingres2006/ingres/lib/iijdbc.jar</code></blockquote>

<h3>Postgres: needs user and password</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:postgresql://localhost/FM3<br/>
mondrian.foodmart.jdbcUser=postgres<br/>
mondrian.foodmart.jdbcPassword=pgAdmin<br/>
mondrian.jdbcDrivers=org.postgresql.Driver</code></blockquote>

<h3>Neoview</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:hpt4jdbc://localhost:18650/:schema=PENTAHO;serverDataSource=PENTAHO_DataSource<br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=com.hp.t4jdbc.HPT4Driver<br/>
driver.classpath=/some/path/hpt4jdbc.jar</code></blockquote>

<h3>Netezza: mimics Postgres</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:netezza://127.0.1.10/foodmart<br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=org.netezza.Driver<br/>
driver.classpath=/some/path/nzjdbc.jar</code></blockquote>

<h3>Sybase</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:jtds:sybase://xxx.xxx.xxx.xxx:<i>port</i>/<i>dbName</i><br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=net.sourceforge.jtds.jdbc.Driver<br/>
driver.classpath=/some/path/jtds-1.2.jar</code></blockquote>

<h3>Teradata</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:teradata://DatabaseServerName/DATABASE=FoodMart<br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=com.ncr.teradata.TeraDriver<br/>
driver.classpath=/some/path/terajdbc/classes/terajdbc4.jar</code></blockquote>

<h3>Vertica</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:vertica://xxx.xxx.xxx.xxx:<i>port</i>/<i>dbName</i><br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=com.vertica.Driver<br/>
driver.classpath=/some/path/vertica.jar</code></blockquote>

<h3>Vectorwise</h3>
<blockquote><code>
mondrian.foodmart.jdbcURL=jdbc:ingres://xxx.xxx.xxx.xxx<i>port</i>/<i>dbName</i><br/>
mondrian.foodmart.jdbcUser=<i>user</i><br/>
mondrian.foodmart.jdbcPassword=<i>password</i><br/>
mondrian.jdbcDrivers=com.ingres.jdbc.IngresDriver <br/>
driver.classpath=/some/path/iijdbc.jar</code></blockquote>

        </Description>
        <Type>String</Type>
        <Default>jdbc:odbc:MondrianFoodMart</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestJdbcUser</Name>
        <Path>mondrian.foodmart.jdbcUser</Path>
        <Category>Testing</Category>
        <Description>
Property containing the JDBC user of a test database.
The default value is null, to cope with DBMSs that don't need this.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestJdbcPassword</Name>
        <Path>mondrian.foodmart.jdbcPassword</Path>
        <Category>Testing</Category>
        <Description>
Property containing the JDBC password of a test database.
The default value is null, to cope with DBMSs that don't need this.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableInMemoryRollup</Name>
        <Path>mondrian.rolap.EnableInMemoryRollup</Path>
        <Description>
Property which turns on or off the in-memory rollup
of segment data. Defaults to <code>true</code>.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SegmentCache</Name>
        <Path>mondrian.rolap.SegmentCache</Path>
        <Description>
Property which defines which SegmentCache implementation to use.
Specify the value as a fully qualified class name, such as
<code>org.example.SegmentCacheImpl</code> where SegmentCacheImpl
is an implementation of {@link mondrian.spi.SegmentCache}.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SparseSegmentCountThreshold</Name>
        <Path>mondrian.rolap.SparseSegmentValueThreshold</Path>
        <Description>
<p>Property that, with {@link #SparseSegmentDensityThreshold}, determines
whether to choose a sparse or dense representation when storing
collections of cell values in memory.</p>

<p>When storing collections of cell values, Mondrian has to choose
between a sparse and a dense representation, based upon the
<code>possible</code> and <code>actual</code> number of values.
The <code>density</code> is <code>actual / possible</code>.</p>

<p>We use a sparse representation if
<code>(possible -
{@link #SparseSegmentCountThreshold countThreshold}) *
{@link #SparseSegmentDensityThreshold densityThreshold} &gt;
actual</code></p>

<p>For example, at the default values
({@link #SparseSegmentCountThreshold countThreshold} = 1000,
{@link #SparseSegmentDensityThreshold} = 0.5),
we use a dense representation for</p>

<ul>
<li>(1000 possible, 0 actual), or</li>
<li>(2000 possible, 500 actual), or</li>
<li>(3000 possible, 1000 actual).</li>
</ul>

<p>Any fewer actual values, or any more
possible values, and Mondrian will use a sparse representation.</p>
        </Description>
        <Type>int</Type>
        <Default>1000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SparseSegmentDensityThreshold</Name>
        <Path>mondrian.rolap.SparseSegmentDensityThreshold</Path>
        <Description>
Property that, with {@link #SparseSegmentCountThreshold},
determines whether to choose a sparse or dense representation when
storing collections of cell values in memory.
        </Description>
        <Type>double</Type>
        <Default>0.5</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>QueryFilePattern</Name>
        <Path>mondrian.test.QueryFilePattern</Path>
        <Category>Testing</Category>
        <Description>
Property that defines
a pattern for which test XML files to run.  Pattern has to
match a file name of the form:
<code>query<i>whatever</i>.xml</code> in the directory.

<p>Example:</p>

<blockquote><code>
mondrian.test.QueryFilePattern=queryTest_fec[A-Za-z0-9_]*.xml
</code></blockquote>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>QueryFileDirectory</Name>
        <Path>mondrian.test.QueryFileDirectory</Path>
        <Category>Testing</Category>
        <Description>
Property defining
where the test XML files are.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>Iterations</Name>
        <Path>mondrian.test.Iterations</Path>
        <Category>Testing</Category>
        <Description>
Not documented.
        </Description>
        <Type>int</Type>
        <Default>1</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>VUsers</Name>
        <Path>mondrian.test.VUsers</Path>
        <Category>Testing</Category>
        <Description>
Not documented.
        </Description>
        <Type>int</Type>
        <Default>1</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TimeLimit</Name>
        <Path>mondrian.test.TimeLimit</Path>
        <Category>Testing</Category>
        <Description>
Property that returns the time limit for the test run in seconds.
If the test is running after that time, it is terminated.
        </Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>Warmup</Name>
        <Path>mondrian.test.Warmup</Path>
        <Category>Testing</Category>
        <Description>
Property that indicates whether this is a "warmup test".
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>CatalogURL</Name>
        <Path>mondrian.catalogURL</Path>
        <Category>Testing</Category>
        <Description>
Property that contains the URL of the catalog to be used by
{@link mondrian.tui.CmdRunner} and XML/A Test.
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableCacheHitCounters</Name>
        <Path>mondrian.rolap.agg.enableCacheHitCounters</Path>
        <Description>
<p>Property that controls whether aggregation cache hit / miss
counters will be enabled.</p>

<p>Note that this will affect performance due to existence of sync
blocks.</p>

@deprecated This property is no longer used, and will be removed in
mondrian-4.0.
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>WarnIfNoPatternForDialect</Name>
        <Path>mondrian.test.WarnIfNoPatternForDialect</Path>
        <Category>Testing</Category>
        <Description>
<p>Property that controls whether warning messages should be printed if a SQL
comparison test does not contain expected SQL statements for the specified
dialect. The tests are skipped if no expected SQL statements are
found for the current dialect.</p>

<p>Possible values are the following:</p>

<ul>
<li>"NONE": no warning (default)</li>
<li>"ANY": any dialect</li>
<li>"ACCESS"</li>
<li>"DERBY"</li>
<li>"LUCIDDB"</li>
<li>"MYSQL"</li>
<li>... and any Dialect enum in SqlPattern.Dialect</li>
</ul>

<p>Specific tests can overwrite the default setting. The priority is:<ul>
<li>Settings besides "ANY" in mondrian.properties file</li>
<li>&lt; Any setting in the test</li>
<li>&lt; "ANY"</li>
</ul>
</p>
        </Description>
        <Type>String</Type>
        <Default>NONE</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>UseAggregates</Name>
        <Path>mondrian.rolap.aggregates.Use</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Boolean property that controls whether Mondrian uses aggregate
tables.</p>

<p>If true, then Mondrian uses aggregate tables. This property is
queried prior to each aggregate query so that changing the value of this
property dynamically (not just at startup) is meaningful.</p>

<p>Aggregates can be read from the database using the
{@link #ReadAggregates} property but will not be used unless this
property is set to true.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ReadAggregates</Name>
        <Path>mondrian.rolap.aggregates.Read</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Boolean property that determines whether Mondrian should read
aggregate tables.</p>

<p>If set to true, then Mondrian scans the database for aggregate tables.
Unless mondrian.rolap.aggregates.Use is set to true, the aggregates
found will not be used.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ChooseAggregateByVolume</Name>
        <Path>mondrian.rolap.aggregates.ChooseByVolume</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Boolean property that controls whether aggregate tables
are ordered by their volume or row count.</p>

<p>If true, Mondrian uses the aggregate table with the smallest volume
(number of rows multiplied by number of columns); if false, Mondrian
uses the aggregate table with the fewest rows.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>AggregateRules</Name>
        <Path>mondrian.rolap.aggregates.rules</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>String property containing the name of the file which defines the
rules for recognizing an aggregate table. Can be either a resource in
the Mondrian jar or a URL.</p>

<p>The default value is "/DefaultRules.xml", which is in the
mondrian.rolap.aggmatcher package in Mondrian.jar.</p>

<p>Normally, this property is not set by a user.</p>
        </Description>
        <Type>String</Type>
        <Default>/DefaultRules.xml</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>AggregateRuleTag</Name>
        <Path>mondrian.rolap.aggregates.rule.tag</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>String property that is the AggRule element's tag value.</p>

<p>Normally, this property is not set by a user.</p>
        </Description>
        <Type>String</Type>
        <Default>default</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>GenerateAggregateSql</Name>
        <Path>mondrian.rolap.aggregates.generateSql</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Boolean property that controls whether to print the SQL code
generated for aggregate tables.</p>

<p>If set, then as each aggregate request is processed, both the lost
and collapsed dimension create and insert sql code is printed.
This is for use in the CmdRunner allowing one to create aggregate table
generation sql.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>DisableCaching</Name>
        <Path>mondrian.rolap.star.disableCaching</Path>
        <Category>Caching</Category>
        <Description>
Boolean property that controls whether a RolapStar's
aggregate data cache is cleared after each query.
If true, no RolapStar will cache aggregate data from one
query to the next (the cache is cleared after each query).
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>DisableLocalSegmentCache</Name>
        <Path>mondrian.rolap.star.disableLocalSegmentCache</Path>
        <Category>Caching</Category>
        <Description>
Boolean property that controls whether the data from segments
is cached locally. To create custom caches, look for the
SegmentCache SPI.
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableTriggers</Name>
        <Path>mondrian.olap.triggers.enable</Path>
        <Description>
<p>Boolean property that controls whether to notify the Mondrian system
when a {@link MondrianProperties property value} changes.</p>

<p>This allows objects dependent on Mondrian properties to react (that
is, reload), when a given property changes via, say,
<code>MondrianProperties.instance().populate(null)</code> or
<code>MondrianProperties.instance().QueryLimit.set(50)</code>.</p>
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>GenerateFormattedSql</Name>
        <Path>mondrian.rolap.generate.formatted.sql</Path>
        <Category>SQL generation</Category>
        <Description>
<p>Boolean property that controls pretty-print mode.</p>

<p>If true, the all SqlQuery SQL strings will be generated in
pretty-print mode, formatted for ease of reading.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableNonEmptyOnAllAxis</Name>
        <Path>mondrian.rolap.nonempty</Path>
        <Description>
Boolean property that controls whether each query axis implicit has the
NON EMPTY option set. The default is false.
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ExpandNonNative</Name>
        <Path>mondrian.native.ExpandNonNative</Path>
        <Category>SQL generation</Category>
        <Description>
If this property is true, when looking for native evaluation of an
expression, Mondrian will expand non-native sub-expressions into
lists of members.
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>CompareSiblingsByOrderKey</Name>
        <Path>mondrian.rolap.compareSiblingsByOrderKey</Path>
        <Description>
Boolean property that controls whether sibling members are
compared according to order key value fetched from their ordinal
expression.  The default is false (only database ORDER BY is used).
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableExpCache</Name>
        <Path>mondrian.expCache.enable</Path>
        <Category>Caching</Category>
        <Description>
Boolean property that controls whether to use a cache for frequently
evaluated expressions. With the cache disabled, an expression like
<code>Rank([Product].CurrentMember,
Order([Product].MEMBERS, [Measures].[Unit Sales]))</code> would perform
many redundant sorts. The default is true.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestExpDependencies</Name>
        <Path>mondrian.test.ExpDependencies</Path>
        <Category>Testing</Category>
        <Description>
<p>Integer property that controls whether to test operators'
dependencies, and how much time to spend doing it.</p>

<p>If this property is positive, Mondrian's test framework allocates an
expression evaluator which evaluates each expression several times, and
makes sure that the results of the expression are independent of
dimensions which the expression claims to be independent of.</p>

<p>The default is 0.</p>
        </Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>TestSeed</Name>
        <Path>mondrian.test.random.seed</Path>
        <Category>Testing</Category>
        <Description>
<p>Seed for random number generator used by some of the tests.</p>

<p>Any value besides 0 or -1 gives deterministic behavior.
The default value is 1234: most users should use this.
Setting the seed to a different value can increase coverage, and
therefore may uncover new bugs.</p>

<p>If you set the value to 0, the system will generate its own
pseudo-random seed.</p>

<p>If you set the value to -1, Mondrian uses the next seed from an
internal random-number generator. This is a little more deterministic
than setting the value to 0.</p>
        </Description>
        <Type>int</Type>
        <Default>1234</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>LocalePropFile</Name>
        <Path>mondrian.rolap.localePropFile</Path>
        <Description>
<p>String property that holds the
name of the class whose resource bundle is to be used to for this
schema. For example, if the class is {@code com.acme.MyResource},
mondrian will look for a resource bundle called
{@code com/acme/MyResource_<i>locale</i>.properties} on the class path.
(This property has a confusing name because in a previous release it
actually held a file name.)</p>

<p>Used for the {@link mondrian.i18n.LocalizingDynamicSchemaProcessor};
see <a href="{@docRoot}/../schema.html#I18n">Internationalization</a>
for more details.</p>

<p>Default value is null.</p>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableNativeCrossJoin</Name>
        <Path>mondrian.native.crossjoin.enable</Path>
        <Category>SQL generation</Category>
        <Description>
If enabled some NON EMPTY CrossJoin will be computed in SQL.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableNativeTopCount</Name>
        <Path>mondrian.native.topcount.enable</Path>
        <Category>SQL generation</Category>
        <Description>
If enabled some TopCount will be computed in SQL.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableNativeFilter</Name>
        <Path>mondrian.native.filter.enable</Path>
        <Category>SQL generation</Category>
        <Description>
If enabled some Filter() will be computed in SQL.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableNativeNonEmpty</Name>
        <Path>mondrian.native.nonempty.enable</Path>
        <Category>SQL generation</Category>
        <Description>
<p>If enabled some NON EMPTY set operations like member.children,
level.members and member descendants will be computed in SQL.</p>
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>AlertNativeEvaluationUnsupported</Name>
        <Path>mondrian.native.unsupported.alert</Path>
        <Category>SQL generation</Category>
        <Description>
<p>Alerting action to take in case native evaluation of a function is
enabled but not supported for that function's usage in a particular
query.  (No alert is ever raised in cases where native evaluation would
definitely have been wasted effort.)</p>

<p>Recognized actions:</p>

<ul>
<li><code>OFF</code>:  do nothing (default action, also used if
unrecognized action is specified)</li>
<li><code>WARN</code>:  log a warning to RolapUtil logger</li>
<li><code>ERROR</code>:  throw an instance of
{@link NativeEvaluationUnsupportedException}</li>
</ul>
        </Description>
        <Type>String</Type>
        <Default>OFF</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableDrillThrough</Name>
        <Path>mondrian.drillthrough.enable</Path>
        <Description>
If disabled, Mondrian will throw an exception if someone attempts to
perform a drillthrough of any kind.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableTotalCount</Name>
        <Path>mondrian.xmla.drillthroughTotalCount.enable</Path>
        <Category>XML/A</Category>
        <Description>
If enabled, first row in the result of an XML/A drill-through request
will be filled with the total count of rows in underlying database.
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>CaseSensitive</Name>
        <Path>mondrian.olap.case.sensitive</Path>
        <Description>
Boolean property that controls whether the MDX parser resolves uses
case-sensitive matching when looking up identifiers. The default is
false.
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MaxRows</Name>
        <Path>mondrian.xmla.drillthroughMaxRows</Path>
        <Category>XML/A</Category>
        <Description>
Property that defines
limit on the number of rows returned by XML/A drill through request.
        </Description>
        <Type>int</Type>
        <Default>1000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MaxConstraints</Name>
        <Path>mondrian.rolap.maxConstraints</Path>
        <Category>SQL generation</Category>
        <Description>
<p>Max number of constraints in a single 'IN' SQL clause.</p>

<p>This value may be variant among database products and their runtime
settings. Oracle, for example, gives the error "ORA-01795: maximum
number of expressions in a list is 1000".</p>

<p>Recommended values:</p>
<ul>
<li>Oracle: 1,000</li>
<li>DB2: 2,500</li>
<li>Other: 10,000</li>
</ul>
        </Description>
        <Type>int</Type>
        <Default>1000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>OptimizePredicates</Name>
        <Path>mondrian.rolap.aggregates.optimizePredicates</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Boolean property that determines whether Mondrian optimizes predicates.</p>

<p>If true, Mondrian may retrieve a little more data than specified in
MDX query and cache it for future use.  For example, if you ask for
data on 48 states of the United States for 3 quarters of 2011,
Mondrian will round out to all 50 states and all 4 quarters.  If
false, Mondrian still optimizes queries that involve all members of a
dimension.</p>
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MaxEvalDepth</Name>
        <Path>mondrian.rolap.evaluate.MaxEvalDepth</Path>
        <Description>
<p>Boolean property that defines the maximum number of passes
allowable while evaluating an MDX expression.</p>

<p>If evaluation exceeds this depth (for example, while evaluating a
very complex calculated member), Mondrian will throw an error.</p>
        </Description>
        <Type>int</Type>
        <Default>10</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>JdbcFactoryClass</Name>
        <Path>mondrian.rolap.aggregates.jdbcFactoryClass</Path>
        <Category>Aggregate tables</Category>
        <Description>
<p>Property that defines the JdbcSchema factory class which
determines the list of tables and columns of a specific datasource.</p>

@see mondrian.rolap.aggmatcher.JdbcSchema
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>DataSourceResolverClass</Name>
        <Path>mondrian.spi.dataSourceResolverClass</Path>
        <Category>Factories</Category>
        <Description>
<p>Property that defines
the name of the plugin class that resolves data source names to
{@link javax.sql.DataSource} objects. The class must implement the
{@link mondrian.spi.DataSourceResolver} interface. If not specified,
the default implementation uses JNDI to perform resolution.</p>

<p>Example:</p>
<blockquote><code>mondrian.spi.dataSourceResolverClass=mondrian.spi.impl.JndiDataSourceResolver</code></blockquote>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>QueryTimeout</Name>
        <Path>mondrian.rolap.queryTimeout</Path>
        <Description>
<p>Property that defines the timeout value (in seconds) for queries. A
value of 0 (the default) indicates no timeout.</p>
        </Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>RolapConnectionShepherdThreadPollingInterval</Name>
        <Path>mondrian.rolap.shepherdThreadPollingInterval</Path>
        <Description>
<p>Property that defines the interval value between
polling operations performed by the RolapConnection shepherd thread.
This controls query timeouts and cancellation, so a small value
(a few milliseconds) is best. Setting this to a value higher than
mondrian.rolap.queryTimeout will result the timeout not being enforced
as expected.</p>

<p>Default value is "1000ms". Default time unit is "ms".</p>
        </Description>
        <Type>String</Type>
        <Default>1000ms</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>RolapConnectionShepherdNbThreads</Name>
        <Path>mondrian.rolap.maxQueryThreads</Path>
        <Description>
<p>Maximum number of MDX query threads per Mondrian server instance.
Defaults to 20.</p>
        </Description>
        <Type>int</Type>
        <Default>20</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SegmentCacheManagerNumberSqlThreads</Name>
        <Path>mondrian.rolap.maxSqlThreads</Path>
        <Description>
<p>Maximum number of threads per Mondrian server instance that
are used to run SQL queries when populating segments.
Defaults to 100.</p>
        </Description>
        <Type>int</Type>
        <Default>100</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SegmentCacheManagerNumberCacheThreads</Name>
        <Path>mondrian.rolap.maxCacheThreads</Path>
        <Description>
<p>Maximum number of threads per Mondrian server instance that
are used to run perform operations on the external caches.
Defaults to 100.</p>
        </Description>
        <Type>int</Type>
        <Default>100</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>IgnoreInvalidMembers</Name>
        <Path>mondrian.rolap.ignoreInvalidMembers</Path>
        <Description>
<p>Property that defines whether non-existent member errors should be
ignored during schema load. If so, the non-existent member is treated
as a null member.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>IgnoreInvalidMembersDuringQuery</Name>
        <Path>mondrian.rolap.ignoreInvalidMembersDuringQuery</Path>
        <Description>
<p>Property that defines whether non-existent member errors should be
ignored during query validation. If so, the non-existent member is
treated as a null member.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>NullMemberRepresentation</Name>
        <Path>mondrian.olap.NullMemberRepresentation</Path>
        <Description>
<p>Property that determines how a null member value is represented in the
result output.</p>
<p>AS 2000 shows this as empty value</p>
<p>AS 2005 shows this as "(null)" value</p>
        </Description>
        <Type>String</Type>
        <Default>#null</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>IterationLimit</Name>
        <Path>mondrian.rolap.iterationLimit</Path>
        <Description>
<p>Integer property indicating the maximum number of iterations
allowed when iterating over members to compute aggregates.  A value of
0 (the default) indicates no limit.</p>
        </Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>CancelPhaseInterval</Name>
        <Path>mondrian.rolap.cancelPhaseInterval</Path>
        <Description>
<p>Positive integer property that determines how many rows are read from sql executions between checks for whether the current mdx query has been cancelled.<br/>
Setting the interval too small may result in a performance hit when reading large result sets;
setting it too high can cause a big delay between the query being marked as cancelled and system resources associated to it being released.
</p>
        </Description>
        <Type>int</Type>
        <Default>10000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ExecutionHistorySize</Name>
        <Path>mondrian.server.monitor.executionHistorySize</Path>
        <Category>Monitoring</Category>
        <Description>
<p>Property that defines how many previous execution instances the
<code>Monitor</code> keeps in its history so that it can send the events
which happen after the fact. Setting this property too high will make the
JVM run out of memory. Setting it too low might prevent some events from
reaching the listeners of the monitor.</p>
<p>This property is for internal use only and should not be changed
unless required. Defaults to 1,000.</p>
        </Description>
        <Type>int</Type>
        <Default>1000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MemoryMonitor</Name>
        <Path>mondrian.util.memoryMonitor.enable</Path>
        <Category>Monitoring</Category>
        <Description>
<p>Property that defines whether the <code>MemoryMonitor</code> should
be enabled. By default it is disabled; memory monitor is not available
before Java version 1.5.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MemoryMonitorThreshold</Name>
        <Path>mondrian.util.memoryMonitor.percentage.threshold</Path>
        <Category>Monitoring</Category>
        <Description>
<p>Property that defines the default <code>MemoryMonitor</code>
percentage threshold. If enabled, when Java's memory monitor detects
that post-garbage collection is above this value, notifications are
generated.</p>
        </Description>
        <Type>int</Type>
        <Default>90</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>MemoryMonitorClass</Name>
        <Path>mondrian.util.MemoryMonitor.class</Path>
        <Category>Factories</Category>
        <Description>
<p>Property that defines
the name of the class used as a memory monitor.</p>

<p>If the value is
non-null, it is used by the <code>MemoryMonitorFactory</code>
to create the implementation.</p>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>ExpCompilerClass</Name>
        <Path>mondrian.calc.ExpCompiler.class</Path>
        <Category>Factories</Category>
        <Description>
<p>Property that defines
the name of the class used to compile scalar expressions.</p>

<p>If the value is
non-null, it is used by the <code>ExpCompiler.Factory</code>
to create the implementation.</p>

<p>To test that for all test MDX queries that all functions can
handle requests for ITERABLE, LIST and MUTABLE_LIST evaluation
results, use the following:</p>

<blockquote><code>mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler</code></blockquote>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>PropertyValueMapFactoryClass</Name>
        <Path>mondrian.rolap.RolapMember.PropertyValueMapFactory.class</Path>
        <Category>Factories</Category>
        <Description>
<p>Property that defines the name of the factory class used
to create maps of member properties to their respective values.</p>

<p>If the value is
non-null, it is used by the <code>PropertyValueFactory</code>
to create the implementation.  If unset,
{@link mondrian.rolap.RolapMemberBase.DefaultPropertyValueMapFactory}
will be used.</p>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SqlMemberSourceValuePoolFactoryClass</Name>
        <Path>mondrian.rolap.SqlMemberSource.ValuePoolFactory.class</Path>
        <Category>Factories</Category>
        <Description>
<p>Property that defines the name of the class used in SqlMemberSource
to pool common values.</p>

<p>If the value is non-null, it is used by the
<code>SqlMemberSource.ValueMapFactory</code>
to create the implementation.  If it is not set, then
{@link mondrian.rolap.SqlMemberSource.NullValuePoolFactory}
will be used, meaning common values will not be pooled.</p>
        </Description>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>CrossJoinOptimizerSize</Name>
        <Path>mondrian.olap.fun.crossjoin.optimizer.size</Path>
        <Description>
<p>Property that defines
when to apply the crossjoin optimization algorithm.</p>

<p>If a crossjoin input list's size is larger than this property's
value and the axis has the "NON EMPTY" qualifier, then
the crossjoin non-empty optimizer is applied.
Setting this value to '0' means that for all crossjoin
input lists in non-empty axes will have the optimizer applied.
On the other hand, if the value is set larger than any possible
list, say <code>Integer.MAX_VALUE</code>, then the optimizer
will never be applied.</p>
        </Description>
        <Type>int</Type>
        <Default>0</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>NullDenominatorProducesNull</Name>
        <Path>mondrian.olap.NullDenominatorProducesNull</Path>
        <Description>
<p>Property that defines
the behavior of division if the denominator evaluates to zero.</p>

<p>If false (the default), if a division has a non-null numerator and
a null denominator, it evaluates to "Infinity", which conforms to SSAS
behavior.</p>

<p>If true, the result is null if the denominator is null. Setting to
true enables the old semantics of evaluating this to null; this does
not conform to SSAS, but is useful in some applications.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableGroupingSets</Name>
        <Path>mondrian.rolap.groupingsets.enable</Path>
        <Category>SQL generation</Category>
        <Description>
<p>Property that defines
whether to generate SQL queries using the <code>GROUPING SETS</code>
construct for rollup. By default it is not enabled.</p>

<p>Ignored on databases which do not support the
<code>GROUPING SETS</code> construct (see
{@link mondrian.spi.Dialect#supportsGroupingSets}).</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>IgnoreMeasureForNonJoiningDimension</Name>
        <Path>mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension</Path>
        <Description>
<p>Property that defines whether to ignore measure when non joining
dimension is in the tuple during aggregation.</p>

<p>If there are unrelated dimensions to a measure in context during
aggregation, the measure is ignored in the evaluation context. This
behaviour kicks in only if the CubeUsage for this measure has
IgnoreUnrelatedDimensions attribute set to false.</p>

<p>For example, Gender doesn't join with [Warehouse Sales] measure.</p>

<p>With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=true
Warehouse Sales gets eliminated and is ignored in the aggregate
value.</p>

<blockquote><code>                                    [Store Sales] + [Warehouse Sales]
SUM({Product.members * Gender.members})    7,913,333.82</code></blockquote>

<p>With mondrian.olap.agg.IgnoreMeasureForNonJoiningDimension=false
Warehouse Sales with Gender All level member contributes to the aggregate
value.</p>

<blockquote><code>                                     [Store Sales] + [Warehouse Sales]
SUM({Product.members * Gender.members})    9,290,730.03</code></blockquote>

<p>On a report where Gender M, F and All members exist a user will see a
large aggregated value compared to the aggregated value that can be
arrived at by summing up values against Gender M and F. This can be
confusing to the user. This feature can be used to eliminate such a
situation.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>NeedDimensionPrefix</Name>
        <Path>mondrian.olap.elements.NeedDimensionPrefix</Path>
        <Description>
<p>Property determines if elements of dimension (levels, hierarchies,
members) need to be prefixed with dimension name in MDX query.</p>

<p>For example when the property is true, the following queries
will error out. The same queries will work when this property
is set to false.</p>

<blockquote><code>select {[M]} on 0 from sales<br/>
select {[USA]} on 0 from sales<br/>
select {[USA].[CA].[Santa Monica]}  on 0 from sales</code></blockquote>

<p>When the property is set to true, any query where elements are
prefixed with dimension name as below will work</p>

<blockquote><code>select {[Gender].[F]} on 0 from sales<br/>
select {[Customers].[Santa Monica]} on 0 from sales</code></blockquote>

<p>Please note that this property does not govern the behaviour
wherein</p>

<blockquote><code>[Gender].[M]</code></blockquote>

<p>is resolved into a fully qualified</p>

<blockquote><code>[Gender].[M]</code></blockquote>

<p> In a scenario where the schema is very large and dimensions have
large number of members a MDX query that has a invalid member in it will
cause mondrian to to go through all the dimensions, levels, hierarchies,
members and properties trying to resolve the element name. This behavior
consumes considerable time and resources on the server. Setting this
property to true will make it fail fast in a scenario where it is
desirable.</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>EnableRolapCubeMemberCache</Name>
        <Path>mondrian.rolap.EnableRolapCubeMemberCache</Path>
        <Category>Caching</Category>
        <Description>
<p>Property that determines whether to cache RolapCubeMember objects,
each of which associates a member of a shared hierarchy with a
particular cube in which it is being used.</p>

<p>The default is {@code true}, that is, use a cache. If you wish to use
the member cache control aspects of {@link mondrian.olap.CacheControl},
you must set this property to {@code false}.</p>

<p>RolapCubeMember has recently become more lightweight to
construct, and we may obsolete this cache and this
property.</p>
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SolveOrderMode</Name>
        <Path>mondrian.rolap.SolveOrderMode</Path>
        <Description>
Property that controls the behavior of
{@link Property#SOLVE_ORDER solve order} of calculated members and sets.

<p>Valid values are "scoped" and "absolute" (the default). See
{@link mondrian.olap.SolveOrderMode} for details.</p>
        </Description>
        <Type>String</Type>
        <Default>ABSOLUTE</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>NativizeMinThreshold</Name>
        <Path>mondrian.native.NativizeMinThreshold</Path>
        <Description>
<p>Property that controls minimum expected cardinality required in
order for NativizeSet to natively evaluate a query.</p>

<p>If the expected cardinality falls below this level the query is
executed non-natively.</p>

<p>It is possible for the actual cardinality to fall below this
threshold even though the expected cardinality falls above this
threshold.  In this case the query will be natively evaluated.</p>
        </Description>
        <Type>int</Type>
        <Default>100000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>NativizeMaxResults</Name>
        <Path>mondrian.native.NativizeMaxResults</Path>
        <Description>
<p>Property that controls the maximum number of results contained in a
NativizeSet result set.</p>

<p>If the number of tuples contained in the result set exceeds this
value Mondrian throws a LimitExceededDuringCrossjoin error.</p>
        </Description>
        <Type>int</Type>
        <Default>150000</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>SsasCompatibleNaming</Name>
        <Path>mondrian.olap.SsasCompatibleNaming</Path>
        <Description>
<p>Property that defines
whether to enable new naming behavior.</p>

<p>If true, hierarchies are named [Dimension].[Hierarchy]; if false,
[Dimension.Hierarchy].</p>
        </Description>
        <Type>boolean</Type>
        <Default>false</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>XmlaSchemaRefreshInterval</Name>
        <Path>mondrian.xmla.SchemaRefreshInterval</Path>
        <Description>
<p>Interval at which to refresh the
list of XML/A catalogs. (Usually known as the
datasources.xml file.)</p>

<p>It is not an active process; no threads will be created. It only
serves as a rate limiter. The refresh process is triggered by requests
to the doPost() servlet method.</p>

<p>Values may have time unit suffixes such as 's' (second) or 'ms'
(milliseconds). Default value is 3000 milliseconds (3 seconds).
Default time unit is milliseconds.</p>

<p>See also
{@link mondrian.xmla.impl.DynamicDatasourceXmlaServlet}.</p>
        </Description>
        <Type>String</Type>
        <Default>3000ms</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>FilterChildlessSnowflakeMembers</Name>
        <Path>mondrian.rolap.FilterChildlessSnowflakeMembers</Path>
        <Category>SQL generation</Category>
        <Description>
<p>Property that defines
whether to generate joins to filter out members in a snowflake
dimension that do not have any children.</p>

<p>If true (the default), some queries to query members of high
levels snowflake dimensions will be more expensive. If false, and if
there are rows in an outer snowflake table that are not referenced by
a row in an inner snowflake table, then some queries will return members
that have no children.</p>

<p>Our recommendation, for best performance, is to remove rows outer
snowflake tables are not referenced by any row in an inner snowflake
table, during your ETL process, and to set this property to
{@code false}.</p>
        </Description>
        <Type>boolean</Type>
        <Default>true</Default>
    </PropertyDefinition>

    <PropertyDefinition>
        <Name>StatisticsProviders</Name>
        <Path>mondrian.statistics.providers</Path>
        <Description>
<p>Comma-separated list of classes to be used to get statistics about the
number of rows in a table, or the number of distinct values in a column.</p>

<p>If there is a value for mondrian.statistics.providers.DATABASE, where
DAtABASE is the current database name (e.g. MYSQL or ORACLE), then that
property overrides.</p>

<p>Example:</p>

<blockquote><code>
mondrian.statistics.providers=mondrian.spi.impl.JdbcStatisticsProvider<br/>
mondrian.statistics.providers.MYSQL=mondrian.spi.impl.JdbcStatisticsProvider,mondrian.spi.impl.JdbcStatisticsProvider</code></blockquote>

<p>This would use JDBC's statistics (via the
java.sql.DatabaseMetaData.getIndexInfo method) for most
databases, but for connections to a MySQL database, would use
external statistics first, and fall back to JDBC statistics
only if external statistics were not available.</p>
        </Description>
        <Core>true</Core>
        <Type>String</Type>
    </PropertyDefinition>

    <PropertyDefinition>
        <Name>LevelPreCacheThreshold</Name>
        <Path>mondrian.rolap.precache.threshold</Path>
        <Description>
            <p>
                Property which governs whether child members or members of a level are precached
                when child or level members are requested within a
                query expression.  For example,
                if an expression references two child members in the store dimension,
                like <code>{ [Store].[USA].[CA], [Store].[USA].[OR] }</code>, precaching will
                load *all* children under [USA] rather than just the 2 requested.
                The threshold value is
                compared against the cardinality of the level to determine
                whether or not precaching should be performed.  If cardinality is
                lower than the threshold value Mondrian will precache.  Setting
                this property to 0 effectively disables precaching.
            </p>
        </Description>
        <Core>true</Core>
        <Type>int</Type>
        <Default>300</Default>
    </PropertyDefinition>

    <PropertyDefinition>
        <Name>WebappDeploy</Name>
        <Path>mondrian.webapp.deploy</Path>
        <Description>
<p>Where mondrian.war will be deployed to. (Used by mondrian's build.xml ant file only.)</p>

<p>Example: <code>mondrian.webapp.deploy=C:/jboss-4.0.2/server/default/deploy</code></p>
        </Description>
        <Core>false</Core>
        <Type>String</Type>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>WebappConnectString</Name>
        <Path>mondrian.webapp.connectString</Path>
        <Description>
<p>Connect string for the webapp. (Used by the webapp only.)</p>

<p>To achieve access control, append say <code>;Role='California
manager'</code> to the connect string.</p>
        </Description>
        <Core>false</Core>
        <Type>String</Type>
        <Default>Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver</Default>
    </PropertyDefinition>
    <PropertyDefinition>
        <Name>Log4jConfiguration</Name>
        <Path>log4j.configuration</Path>
        <Description>
<p>Set mondrian logging information if not provided by containing application.</p>

<p>Examples:</p>

<blockquote><code>
log4j.configuration=file://full/path/log4j.xml<br/>
log4j.configuration=file:log4j.properties</code></blockquote>
        </Description>
        <Core>false</Core>
        <Type>String</Type>
    </PropertyDefinition>
</PropertyDefinitions>
