PDA

View Full Version : [Mondrian] Re: Eigenbase perforce change 8742 for review



John V. Sichi
02-21-2007, 03:52 AM
Richard, in the change below, did you intentionally re-enable
mondrian.util.memoryMonitor.enable=true? The comment in
mondrian.properties still says the default should be false (and I agree,
since Derby tests fail with true). But you changed the actual default
in MondrianProperties.

I remain convinced that a properties file that a developer is forced to
check out for overlapping purposes (submitting changes to property
definitions; changing mandatory site-specific settings as part of
sandbox setup) is very problematic. It's especially troublesome because
it breaks the rhythm of edit, run tests, check in--instead, after
running tests against changed property definitions, the developer has to
remember to undo site-specific settings, check in, and then re-checkout
and reapply site-specific settings.

Julian has spoken quite adamantly, but I'm not clear on why site-local
setup instructions can't be kept "members only" for developers so that
there's no impact on end-users, forum support, etc. But pending that:
Richard, could you be more careful?

JVS

Richard Emberson wrote:
> http://p4web.eigenbase.org/@md=d&c=6PU@//8742?ac=10
>
> Change 8742 by emberson (AT) bortei (DOT) head on 2007/02/17 11:30:51
>
> MONDRIAN
> ObjectFactory now uses MondrianProperties values as
> overriding property mechanism. The factory properties were
> added to MondrianProperties.java for the MemoryMonitorFactory
> and the ExpCompiler.Factory. Removed previously added
> alteration to build.xml - not needed when using MondrianProperties.
>
> Affected files ...
>
> ... //open/mondrian/build.xml#140 edit
> ... //open/mondrian/doc/configuration.html#21 edit
> ... //open/mondrian/mondrian.properties#35 edit
> ... //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 edit
> ... //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 edit
> ... //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 edit
> ... //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 edit
>
> Differences ...
>
> ==== //open/mondrian/build.xml#140 (ktext) ====
>
> 2c2
> < == $Id: //open/mondrian/build.xml#139 $
> ---
>> == $Id: //open/mondrian/build.xml#140 $
> 458,461d457
> < <propertyset id="properties-starting-with-mondrian">
> < <propertyref prefix="mondrian"/>
> < </propertyset>
> <
> 485,489d480
> < <!-- include all properties starting with "mondrian" -->
> < <syspropertyset>
> < <propertyset refid="properties-starting-with-mondrian"/>
> < </syspropertyset>
> <
>
> ==== //open/mondrian/doc/configuration.html#21 (ktext) ====
>
> 3c3
> < == $Id: //open/mondrian/doc/configuration.html#20 $
> ---
>> == $Id: //open/mondrian/doc/configuration.html#21 $
> 97c97
> < mondrian.foodmart .jdbcURL</a></code></td>
> ---
>> mondrian.foodmart.jdbcURL</a></code></td>
> 105c105
> < mondrian.query. limit</a></code></td>
> ---
>> mondrian.query.limit</a></code></td>
> 116c116
> < mondrian. jdbcDrivers</a></code></td>
> ---
>> mondrian.jdbcDrivers</a></code></td>
> 119c119
> < sun.jdbc.odbc .JdbcOdbcDriver,<br>
> ---
>> sun.jdbc.odbc.JdbcOdbcDriver,<br>
> 123c123
> < com.mysql.jdbc .Driver</td>
> ---
>> com.mysql.jdbc.Driver</td>
> 130c130
> < mondrian.result .limit</a></code></td>
> ---
>> mondrian.result.limit</a></code></td>
> 156c156
> < mondrian.rolap. CachePool.costLimit</a></code></td>
> ---
>> mondrian.rolap.CachePool.costLimit</a></code></td>
> 164c164
> < evaluate. MaxEvalDepth</a></code></td>
> ---
>> evaluate.MaxEvalDepth</a></code></td>
> 174c174
> < mondrian.rolap. LargeDimension Threshold</a></code></td>
> ---
>> mondrian.rolap.LargeDimension Threshold</a></code></td>
> 185c185
> < mondrian.rolap. SparseSegment ValueThreshold</a></code></td>
> ---
>> mondrian.rolap.SparseSegmentValueThreshold</a></code></td>
> 226c226
> < mondrian.rolap. SparseSegment DensityThreshold</a></code></td>
> ---
>> mondrian.rolap.SparseSegmentDensityThreshold</a></code></td>
> 229c229
> < <td>See <code>mondrian.rolap. SparseSegment ValueThreshold</code>.</td>
> ---
>> <td>See <code>mondrian.rolap.SparseSegmentValueThreshold</code>.</td>
> 235c235
> < mondrian.olap. triggers.enable</a></code></td>
> ---
>> mondrian.olap.triggers.enable</a></code></td>
> 244c244
> < <p>&nbsp;<code>MondrianProperties .instance() .populate(null)</code>;</p>
> ---
>> <p>&nbsp;<code>MondrianProperties.instance().populate(null)</code>;</p>
> 249c249
> < <p><code>MondrianProperties .instance() .QueryLimit.set(50);</code></p>
> ---
>> <p><code>MondrianProperties.instance().QueryLimit.set(50);</code></p>
> 255c255
> < mondrian.olap. case.sensitive</a></code></td>
> ---
>> mondrian.olap.case.sensitive</a></code></td>
> 265c265
> < mondrian.rolap. localePropFile</a></code></td>
> ---
>> mondrian.rolap.localePropFile</a></code></td>
> 303,304c303
> < <td><a href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">
> < <code>mondrian.rolap.ignoreInvalidMembers</code></a></td>
> ---
>> <td><code><a href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">mondrian.rolap.ignoreInvalidMembers</a></code></td>
> 312,313c311
> < <td><a href="api/mondrian/olap/MondrianProperties.html#IterationLimit">
> < <code>mondrian.rolap.IterationLimit</code></a></td>
> ---
>> <td><code><a href="api/mondrian/olap/MondrianProperties.html#IterationLimit">mondrian.rolap.IterationLimit</a></code></td>
> 329a328,365
>> <tr>
>> <td>
>> <code>
>> <a href="api/mondrian/olap/MondrianProperties.html#CrossJoinOptimizerSize">mondrian.olap.fun.crossjoin.optimizer.size</a></code></td>
>> <td>int</td>
>> <td>0</td>
>> <td>
>> 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.
>> </td>
>> </tr>
>> <tr>
>> <td>
>> <code>
>> <a href="api/mondrian/olap/MondrianProperties.html#UseImplicitMembers">mondrian.rolap.RolapResult.useImplicitMembers</a></code></td>
>> <td>boolean</td>
>> <td>true</td>
>> <td>
>> The crossjoin optimizer is flawed. It evaluates potential cells
>> using default members when a member is not explicitly set in
>> the particular axis. This works unless another axis, normal or
>> slicer, uses a member other than the default.
>> Setting this property to <code>true</code> will enable the
>> RolapResult to collect these implied members and if any are
>> found, then re-evaluate using the discovered members.
>> <p>
>> If you do not enable this property, then the crossjoin optimizer,
>> if used, can produce errors. Bad results are produced for some
>> queries and some data sets - its a combination of both so the
>> error does not manifest itself all the time.
>> </td>
>> </tr>
> 340c376
> < mondrian.trace. level</a></code></td>
> ---
>> mondrian.trace.level</a></code></td>
> 350c386
> < mondrian.debug. out.file</a></code></td>
> ---
>> mondrian.debug.out.file</a></code></td>
> 359c395
> < mondrian.rolap. RolapResult. printCacheables</a></code></td>
> ---
>> mondrian.rolap.RolapResult.printCacheables</a></code></td>
> 375c411
> < mondrian.test. Name</a></code></td>
> ---
>> mondrian.test.Name</a></code></td>
> 386c422
> < mondrian.test. Class</a></code></td>
> ---
>> mondrian.test.Class</a></code></td>
> 393c429
> < junit .framework.Test</a></code> or has a method <code>public static
> ---
>> junit.framework.Test</a></code> or has a method <code>public static
> 398c434
> < mondrian.test .connectString</a></code></td>
> ---
>> mondrian.test.connectString</a></code></td>
> 409c445
> < mondrian.test .QueryFilePattern</a></code></td>
> ---
>> mondrian.test.QueryFilePattern</a></code></td>
> 418c454
> < mondrian.test .QueryFileDirectory</a></code></td>
> ---
>> mondrian.test.QueryFileDirectory</a></code></td>
> 426c462
> < mondrian.test .Iterations</a></code></td>
> ---
>> mondrian.test.Iterations</a></code></td>
> 434c470
> < mondrian.test .VUsers</a></code></td>
> ---
>> mondrian.test.VUsers</a></code></td>
> 442c478
> < mondrian.test .TimeLimit</a></code></td>
> ---
>> mondrian.test.TimeLimit</a></code></td>
> 451c487
> < mondrian.test .Warmup</a></code></td>
> ---
>> mondrian.test.Warmup</a></code></td>
> 459c495
> < mondrian. catalogURL</a></code></td>
> ---
>> mondrian.catalogURL</a></code></td>
> 468c504
> < mondrian.test .ExpDependencies</a></code></td>
> ---
>> mondrian.test.ExpDependencies</a></code></td>
> 482c518
> < mondrian.test .random.seed</a></code></td>
> ---
>> mondrian.test.random.seed</a></code></td>
> 504c540
> < mondrian.test. jdbcURL</a></code></td>
> ---
>> mondrian.test.jdbcURL</a></code></td>
> 513c549
> < mondrian.test .jdbcUser</a></code></td>
> ---
>> mondrian.test.jdbcUser</a></code></td>
> 522c558
> < mondrian.test .jdbcPassword</a></code></td>
> ---
>> mondrian.test.jdbcPassword</a></code></td>
> 539c575
> < mondrian.rolap .aggregates.Use</a></code></td>
> ---
>> mondrian.rolap.aggregates.Use</a></code></td>
> 553c589
> < mondrian.rolap .aggregates.Read</a></code></td>
> ---
>> mondrian.rolap.aggregates.Read</a></code></td>
> 566c602
> < mondrian.rolap. aggregates. ChooseByVolume</a></code></td>
> ---
>> mondrian.rolap.aggregates.ChooseByVolume</a></code></td>
> 578c614
> < mondrian.rolap. aggregates.rules</a></code></td>
> ---
>> mondrian.rolap.aggregates.rules</a></code></td>
> 582c618
> < (which is in the <code>mondrian.rolap .aggmatcher</code>
> ---
>> (which is in the <code>mondrian.rolap.aggmatcher</code>
> 593c629
> < mondrian.rolap. aggregates.rule.tag</a></code></td>
> ---
>> mondrian.rolap.aggregates.rule.tag</a></code></td>
> 603c639
> < <a href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap. aggregates. generateSql</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap.aggregates.generateSql</a></code></td>
> 624c660
> < <a href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap. star.disable Caching</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap.star.disableCaching</a></code></td>
> 635c671
> < <a href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache .enable</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache.enable</a></code></td>
> 647c683
> < Order([Product] .MEMBERS, [Measures].[Unit Sales]))<br>
> ---
>> Order([Product].MEMBERS, [Measures].[Unit Sales]))<br>
> 653c689
> < mondrian.rolap. RolapResult. flushAfter EachQuery</a></code></td>
> ---
>> mondrian.rolap.RolapResult.flushAfterEachQuery</a></code></td>
> 669c705
> < <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native .crossjoin.enable</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native.crossjoin.enable</a></code></td>
> 680c716
> < <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native .topcount.enable</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native.topcount.enable</a></code></td>
> 690c726
> < <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native .filter.enable</a></code></td>
> ---
>> <a href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native.filter.enable</a></code></td>
> 701c737
> < mondrian.native .nonempty.enable</a></code></td>
> ---
>> mondrian.native.nonempty.enable</a></code></td>
> 713,714c749,750
> < <td><a href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">
> < <code>mondrian.native.unsupported.alert</code></a></td>
> ---
>> <td><code><a
>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">mondrian.native.unsupported.alert</a></code></td>
> 727c763
> < mondrian.rolap. generate.formatted .sql</a></code></td>
> ---
>> mondrian.rolap.generate.formatted.sql</a></code></td>
> 738c774
> < mondrian.rolap. maxConstraints</a></code></td>
> ---
>> mondrian.rolap.maxConstraints</a></code></td>
> 766c802
> < mondrian.xmla. drillthrough TotalCount.enable</a></code></td>
> ---
>> mondrian.xmla.drillthrough TotalCount.enable</a></code></td>
> 775c811
> < mondrian.xmla. drillthrough MaxRows</a></code></td>
> ---
>> mondrian.xmla.drillthrough MaxRows</a></code></td>
> 812a849,850
>> <tr>
>> <td style="vertical-align: top;" colspan="4">
> 813a852,885
>> <b><br>Factories</b>
>> </td>
>> </tr>
>> <tr>
>> <td><code>
>> <a href="api/mondrian/olap/MondrianProperties.html#MemoryMonitorClass">
>> mondrian.util.MemoryMonitor.class
>> </a></code></td>
>>
>> <td>string</td>
>> <td>-</td>
>> <td>
>> By default this property does not have a value.
>> If set, then it is the class name of an implementation of
>> the MemoryMonitor class and is used by the
>> MemoryMonitorFactory to create the single instance.
>> </td>
>> </tr>
>> <tr>
>> <td><code>
>> <a href="api/mondrian/olap/MondrianProperties.html#ExpCompilerClass">
>> mondrian.calc.ExpCompiler.class
>> </a></code></td>
>>
>> <td>string</td>
>> <td>-</td>
>> <td>
>> By default this property does not have a value.
>> If set, then it is the class name of an implementation of
>> the ExpCompiler class and is used by the
>> ExpCompiler.Factory to create each instance.
>> </td>
>> </tr>
>>
> 1091c1163
> < Version: $Id: //open/mondrian/doc/configuration.html#20 $
> ---
>> Version: $Id: //open/mondrian/doc/configuration.html#21 $
>
> ==== //open/mondrian/mondrian.properties#35 (ktext) ====
>
> 1c1
> < # $Id: //open/mondrian/mondrian.properties#34 $
> ---
>> # $Id: //open/mondrian/mondrian.properties#35 $
> 71,75c71,75
> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
> < #mondrian.foodmart.jdbcUser=foodmart
> < #mondrian.foodmart.jdbcPassword=foodmart
> < #mondrian.jdbcDrivers=com.mysql.jdbc.Driver
> ---
>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>> mondrian.foodmart.jdbcUser=foodmart
>> mondrian.foodmart.jdbcPassword=foodmart
>> mondrian.jdbcDrivers=com.mysql.jdbc.Driver
> 284c284,290
> < mondrian.util.memoryMonitor.percentage.threshold=90
> ---
>> # If enabled, when Java5 memory monitor detects that post-garbage
>> # collection is above this value, notifications are generated.
>> #mondrian.util.memoryMonitor.percentage.threshold=90
>>
>> ###############################################################################
>> # Property for overriding default MemoryMonitor implementation.
>> #mondrian.util.MemoryMonitor.class=null
> 286a293
>> # Property for overriding default ExpCompiler implementation.
> 288c295,314
> < #mondrian.calc.ExpCompiler=mondrian.olap.fun.ResultStyleCompiler
> ---
>> #
>> # To test that for all test MDX queries that all functions can
>> # handle requests for ITERABLE, LIST and MUTABLE_LIST evalutation
>> # results, the following can be used:
>> # mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler
>> #
>> #mondrian.calc.ExpCompiler.class=null
>>
>> ###############################################################################
>> # Controls when a non-empty crossjoin input list will have the
>> # optimiztion applied base upon the list's size.
>> # The size of the list must be greater than the property value size
>> # for optimiztion.
>> # mondrian.olap.fun.crossjoin.optimizer.size=0
>>
>> ###############################################################################
>> # If true, the the RolapResult will apply its implicit member
>> # fix by merging axes when a non-empty crossjoin uses the incorrect
>> # memebers.
>> # mondrian.rolap.RolapResult.useImplicitMembers=true
>
> ==== //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 (ktext) ====
>
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
> 11a12
>> import org.eigenbase.util.property.StringProperty;
> 21c22
> < * @version $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
> ---
>> * @version $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
> 352a354,362
>> /**
>> * Return the <code>ExpCompiler.Factory</code property name.
>> *
>> * @return <code>ExpCompiler.Factory</code> property name
>> */
>> protected StringProperty getStringProperty() {
>> return MondrianProperties.instance().ExpCompilerClass;
>> }
>
> ==== //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 (ktext) ====
>
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
> 58c58
> < * @version $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
> ---
>> * @version $Id: //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
> 858c858
> < this, "mondrian.util.memoryMonitor.enable", false);
> ---
>> this, "mondrian.util.memoryMonitor.enable", true);
> 864a865,910
>> /**
>> * The <code>MemoryMonitor</code> class property. If the value is
>> * non-null, it is used by the <code>MemoryMonitorFactory</code>
>> * to create the implementation.
>> */
>> public final StringProperty MemoryMonitorClass = new StringProperty(
>> this, "mondrian.util.MemoryMonitor.class", null);
>>
>> /**
>> * The <code>ExpCompiler</code> class property. If the value is
>> * non-null, it is used by the <code>ExpCompiler.Factory</code>
>> * to create the implementation.
>> */
>> public final StringProperty ExpCompilerClass = new StringProperty(
>> this, "mondrian.calc.ExpCompiler.class", null);
>>
>> /**
>> * 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.
>> */
>> public final IntegerProperty CrossJoinOptimizerSize = new IntegerProperty(
>> this, "mondrian.olap.fun.crossjoin.optimizer.size", 0);
>>
>> /**
>> * The crossjoin optimizer is flawed. It evaluates potential cells
>> * using default members when a member is not explicitly set in
>> * the particular axis. This works unless another axis, normal or
>> * slicer, uses a member other than the default.
>> * Setting this property to <code>true</code> will enable the
>> * RolapResult to collect these implied members and if any are
>> * found, then re-evaluate using the discovered members.
>> * <p>
>> * If you do not enable this property, then the crossjoin optimizer,
>> * if used, can produce errors. Bad results are produced for some
>> * queries and some data sets - its a combination of both so the
>> * error does not manifest itself all the time.
>> */
>> public final BooleanProperty UseImplicitMembers = new BooleanProperty(
>> this, "mondrian.rolap.RolapResult.useImplicitMembers", true);
>
> ==== //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 (ktext) ====
>
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
> 14a15
>> import org.eigenbase.util.property.StringProperty;
> 40c41
> < * @version $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
> ---
>> * @version $Id: //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
> 135a137,145
>> /**
>> * Return the <code>MemoryMonitorFactory</code property name.
>> *
>> * @return <code>MemoryMonitorFactory</code> property name
>> */
>> protected StringProperty getStringProperty() {
>> return MondrianProperties.instance().MemoryMonitorClass;
>> }
>>
>
> ==== //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 (ktext) ====
>
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
> ---
>> // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
> 11a12
>> import org.eigenbase.util.property.StringProperty;
> 278c279
> < * @version $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
> ---
>> * @version $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
> 481,482c482,485
> < * By default the name returned is the value of a property
> < * with key equal to the class name of the <code>interfaceClass</code>.
> ---
>> * The factory's <code>StringProperty</code> is gotten and
>> * if it has a non-null value, then that is returned. Otherwise,
>> * the <code>StringProperty</code>'s name (path) is used as the
>> * name to probe the <code>Properties</code> object for a value.
> 488,489c491,496
> < return (props == null)
> < ? null : props.getProperty(this.interfaceClass.getName());
> ---
>> final StringProperty stringProp = getStringProperty();
>> final String className = stringProp.get();
>> return (className != null)
>> ? className
>> : (props == null)
>> ? null : props.getProperty(stringProp.getPath());
> 491a499,505
>> /**
>> * Return the <code>StringProperty</code> associated with this factory.
>> *
>> * @return the <code>StringProperty</code>
>> */
>> protected abstract StringProperty getStringProperty();
>>
>

_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

John V. Sichi
02-21-2007, 04:50 AM
Richard, another regression:
TestAggregationManager.testNonEmptyCrossJoinLoneAxis now fails with a
stack overflow. If I sync back to eigenchange 8726, it works fine.

JVS
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

John V. Sichi
02-21-2007, 04:50 AM
John V. Sichi wrote:
> Richard, another regression:
> TestAggregationManager.testNonEmptyCrossJoinLoneAxis now fails with a
> stack overflow. If I sync back to eigenchange 8726, it works fine.

(Note that this test is only enabled for Derby, because it verifies SQL
generation, so the reason you didn't hit it is probably that you
normally run regression with a different DBMS.)

JVS
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

Richard Emberson
02-21-2007, 03:20 PM
John,

If you put your local properties into a file, say
local.properties, and then call the build script
passing that that file name, e.g.,

> ./build.sh -propertyfile local.properties test

it will pick up the properties from that file.
Since I wrap all calls to the build script, I
don't have to type it in all the time.

Richard


John V. Sichi wrote:
> Richard, in the change below, did you intentionally re-enable
> mondrian.util.memoryMonitor.enable=true? The comment in
> mondrian.properties still says the default should be false (and I agree,
> since Derby tests fail with true). But you changed the actual default
> in MondrianProperties.
>
> I remain convinced that a properties file that a developer is forced to
> check out for overlapping purposes (submitting changes to property
> definitions; changing mandatory site-specific settings as part of
> sandbox setup) is very problematic. It's especially troublesome because
> it breaks the rhythm of edit, run tests, check in--instead, after
> running tests against changed property definitions, the developer has to
> remember to undo site-specific settings, check in, and then re-checkout
> and reapply site-specific settings.
>
> Julian has spoken quite adamantly, but I'm not clear on why site-local
> setup instructions can't be kept "members only" for developers so that
> there's no impact on end-users, forum support, etc. But pending that:
> Richard, could you be more careful?
>
> JVS
>
> Richard Emberson wrote:
>> http://p4web.eigenbase.org/@md=d&c=6PU@//8742?ac=10
>>
>> Change 8742 by emberson (AT) bortei (DOT) head on 2007/02/17 11:30:51
>>
>> MONDRIAN
>> ObjectFactory now uses MondrianProperties values as
>> overriding property mechanism. The factory properties were
>> added to MondrianProperties.java for the MemoryMonitorFactory
>> and the ExpCompiler.Factory. Removed previously added
>> alteration to build.xml - not needed when using
>> MondrianProperties.
>>
>> Affected files ...
>>
>> ... //open/mondrian/build.xml#140 edit
>> ... //open/mondrian/doc/configuration.html#21 edit
>> ... //open/mondrian/mondrian.properties#35 edit
>> ... //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 edit
>> ... //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65
>> edit
>> ... //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7
>> edit
>> ... //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 edit
>>
>> Differences ...
>>
>> ==== //open/mondrian/build.xml#140 (ktext) ====
>>
>> 2c2
>> < == $Id: //open/mondrian/build.xml#139 $
>> ---
>>> == $Id: //open/mondrian/build.xml#140 $
>> 458,461d457
>> < <propertyset id="properties-starting-with-mondrian">
>> < <propertyref prefix="mondrian"/>
>> < </propertyset>
>> < 485,489d480
>> < <!-- include all properties starting with "mondrian" -->
>> < <syspropertyset>
>> < <propertyset refid="properties-starting-with-mondrian"/>
>> < </syspropertyset>
>> <
>> ==== //open/mondrian/doc/configuration.html#21 (ktext) ====
>>
>> 3c3
>> < == $Id: //open/mondrian/doc/configuration.html#20 $
>> ---
>>> == $Id: //open/mondrian/doc/configuration.html#21 $
>> 97c97
>> < mondrian.foodmart .jdbcURL</a></code></td>
>> ---
>>> mondrian.foodmart.jdbcURL</a></code></td>
>> 105c105
>> < mondrian.query. limit</a></code></td>
>> ---
>>> mondrian.query.limit</a></code></td>
>> 116c116
>> < mondrian. jdbcDrivers</a></code></td>
>> ---
>>> mondrian.jdbcDrivers</a></code></td>
>> 119c119
>> < sun.jdbc.odbc .JdbcOdbcDriver,<br>
>> ---
>>> sun.jdbc.odbc.JdbcOdbcDriver,<br>
>> 123c123
>> < com.mysql.jdbc .Driver</td>
>> ---
>>> com.mysql.jdbc.Driver</td>
>> 130c130
>> < mondrian.result .limit</a></code></td>
>> ---
>>> mondrian.result.limit</a></code></td>
>> 156c156
>> < mondrian.rolap. CachePool.costLimit</a></code></td>
>> ---
>>> mondrian.rolap.CachePool.costLimit</a></code></td>
>> 164c164
>> < evaluate. MaxEvalDepth</a></code></td>
>> ---
>>> evaluate.MaxEvalDepth</a></code></td>
>> 174c174
>> < mondrian.rolap. LargeDimension Threshold</a></code></td>
>> ---
>>> mondrian.rolap.LargeDimension Threshold</a></code></td>
>> 185c185
>> < mondrian.rolap. SparseSegment ValueThreshold</a></code></td>
>> ---
>>> mondrian.rolap.SparseSegmentValueThreshold</a></code></td>
>> 226c226
>> < mondrian.rolap. SparseSegment DensityThreshold</a></code></td>
>> ---
>>> mondrian.rolap.SparseSegmentDensityThreshold</a></code></td>
>> 229c229
>> < <td>See <code>mondrian.rolap. SparseSegment
>> ValueThreshold</code>.</td>
>> ---
>>> <td>See
>>> <code>mondrian.rolap.SparseSegmentValueThreshold</code>.</td>
>> 235c235
>> < mondrian.olap. triggers.enable</a></code></td>
>> ---
>>> mondrian.olap.triggers.enable</a></code></td>
>> 244c244
>> < <p>&nbsp;<code>MondrianProperties .instance()
>> .populate(null)</code>;</p>
>> ---
>>>
>>> <p>&nbsp;<code>MondrianProperties.instance().populate(null)</code>;</p>
>> 249c249
>> < <p><code>MondrianProperties .instance()
>> .QueryLimit.set(50);</code></p>
>> ---
>>>
>>> <p><code>MondrianProperties.instance().QueryLimit.set(50);</code></p>
>> 255c255
>> < mondrian.olap. case.sensitive</a></code></td>
>> ---
>>> mondrian.olap.case.sensitive</a></code></td>
>> 265c265
>> < mondrian.rolap. localePropFile</a></code></td>
>> ---
>>> mondrian.rolap.localePropFile</a></code></td>
>> 303,304c303
>> < <td><a
>> href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">
>> < <code>mondrian.rolap.ignoreInvalidMembers</code></a></td>
>> ---
>>> <td><code><a
>>> href="api/mondrian/olap/MondrianProperties.html#IgnoreInvalidMembers">mondrian.rolap.ignoreInvalidMembers</a></code></td>
>>>
>> 312,313c311
>> < <td><a
>> href="api/mondrian/olap/MondrianProperties.html#IterationLimit">
>> < <code>mondrian.rolap.IterationLimit</code></a></td>
>> ---
>>> <td><code><a
>>> href="api/mondrian/olap/MondrianProperties.html#IterationLimit">mondrian.rolap.IterationLimit</a></code></td>
>>>
>> 329a328,365
>>> <tr> <td>
>>> <code>
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#CrossJoinOptimizerSize">mondrian.olap.fun.crossjoin.optimizer.size</a></code></td>
>>>
>>> <td>int</td>
>>> <td>0</td>
>>> <td>
>>> 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.
>>> </td>
>>> </tr>
>>> <tr> <td>
>>> <code>
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#UseImplicitMembers">mondrian.rolap.RolapResult.useImplicitMembers</a></code></td>
>>>
>>> <td>boolean</td>
>>> <td>true</td>
>>> <td>
>>> The crossjoin optimizer is flawed. It evaluates potential cells
>>> using default members when a member is not explicitly set in
>>> the particular axis. This works unless another axis, normal or
>>> slicer, uses a member other than the default.
>>> Setting this property to <code>true</code> will enable the
>>> RolapResult to collect these implied members and if any are
>>> found, then re-evaluate using the discovered members.
>>> <p>
>>> If you do not enable this property, then the crossjoin
>>> optimizer,
>>> if used, can produce errors. Bad results are produced for some
>>> queries and some data sets - its a combination of both so
>>> the error does not manifest itself all the time.
>>> </td>
>>> </tr>
>> 340c376
>> < mondrian.trace. level</a></code></td>
>> ---
>>> mondrian.trace.level</a></code></td>
>> 350c386
>> < mondrian.debug. out.file</a></code></td>
>> ---
>>> mondrian.debug.out.file</a></code></td>
>> 359c395
>> < mondrian.rolap. RolapResult. printCacheables</a></code></td>
>> ---
>>> mondrian.rolap.RolapResult.printCacheables</a></code></td>
>> 375c411
>> < mondrian.test. Name</a></code></td>
>> ---
>>> mondrian.test.Name</a></code></td>
>> 386c422
>> < mondrian.test. Class</a></code></td>
>> ---
>>> mondrian.test.Class</a></code></td>
>> 393c429
>> < junit .framework.Test</a></code> or has a method <code>public
>> static
>> ---
>>> junit.framework.Test</a></code> or has a method <code>public
>>> static
>> 398c434
>> < mondrian.test .connectString</a></code></td>
>> ---
>>> mondrian.test.connectString</a></code></td>
>> 409c445
>> < mondrian.test .QueryFilePattern</a></code></td>
>> ---
>>> mondrian.test.QueryFilePattern</a></code></td>
>> 418c454
>> < mondrian.test .QueryFileDirectory</a></code></td>
>> ---
>>> mondrian.test.QueryFileDirectory</a></code></td>
>> 426c462
>> < mondrian.test .Iterations</a></code></td>
>> ---
>>> mondrian.test.Iterations</a></code></td>
>> 434c470
>> < mondrian.test .VUsers</a></code></td>
>> ---
>>> mondrian.test.VUsers</a></code></td>
>> 442c478
>> < mondrian.test .TimeLimit</a></code></td>
>> ---
>>> mondrian.test.TimeLimit</a></code></td>
>> 451c487
>> < mondrian.test .Warmup</a></code></td>
>> ---
>>> mondrian.test.Warmup</a></code></td>
>> 459c495
>> < mondrian. catalogURL</a></code></td>
>> ---
>>> mondrian.catalogURL</a></code></td>
>> 468c504
>> < mondrian.test .ExpDependencies</a></code></td>
>> ---
>>> mondrian.test.ExpDependencies</a></code></td>
>> 482c518
>> < mondrian.test .random.seed</a></code></td>
>> ---
>>> mondrian.test.random.seed</a></code></td>
>> 504c540
>> < mondrian.test. jdbcURL</a></code></td>
>> ---
>>> mondrian.test.jdbcURL</a></code></td>
>> 513c549
>> < mondrian.test .jdbcUser</a></code></td>
>> ---
>>> mondrian.test.jdbcUser</a></code></td>
>> 522c558
>> < mondrian.test .jdbcPassword</a></code></td>
>> ---
>>> mondrian.test.jdbcPassword</a></code></td>
>> 539c575
>> < mondrian.rolap .aggregates.Use</a></code></td>
>> ---
>>> mondrian.rolap.aggregates.Use</a></code></td>
>> 553c589
>> < mondrian.rolap .aggregates.Read</a></code></td>
>> ---
>>> mondrian.rolap.aggregates.Read</a></code></td>
>> 566c602
>> < mondrian.rolap. aggregates. ChooseByVolume</a></code></td>
>> ---
>>> mondrian.rolap.aggregates.ChooseByVolume</a></code></td>
>> 578c614
>> < mondrian.rolap. aggregates.rules</a></code></td>
>> ---
>>> mondrian.rolap.aggregates.rules</a></code></td>
>> 582c618
>> < (which is in the <code>mondrian.rolap .aggmatcher</code>
>> ---
>>> (which is in the <code>mondrian.rolap.aggmatcher</code>
>> 593c629
>> < mondrian.rolap. aggregates.rule.tag</a></code></td>
>> ---
>>> mondrian.rolap.aggregates.rule.tag</a></code></td>
>> 603c639
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap.
>> aggregates. generateSql</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#GenerateAggregateSql">mondrian.rolap.aggregates.generateSql</a></code></td>
>>>
>> 624c660
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap.
>> star.disable Caching</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#DisableCaching">mondrian.rolap.star.disableCaching</a></code></td>
>>>
>> 635c671
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache
>> .enable</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#EnableExpCache">mondrian.expCache.enable</a></code></td>
>>>
>> 647c683
>> < Order([Product] .MEMBERS, [Measures].[Unit Sales]))<br>
>> ---
>>> Order([Product].MEMBERS, [Measures].[Unit Sales]))<br>
>> 653c689
>> < mondrian.rolap. RolapResult. flushAfter EachQuery</a></code></td>
>> ---
>>> mondrian.rolap.RolapResult.flushAfterEachQuery</a></code></td>
>> 669c705
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native
>> .crossjoin.enable</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeCrossJoin">mondrian.native.crossjoin.enable</a></code></td>
>>>
>> 680c716
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native
>> .topcount.enable</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeTopCount">mondrian.native.topcount.enable</a></code></td>
>>>
>> 690c726
>> < <a
>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native
>> .filter.enable</a></code></td>
>> ---
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#EnableNativeFilter">mondrian.native.filter.enable</a></code></td>
>>>
>> 701c737
>> < mondrian.native .nonempty.enable</a></code></td>
>> ---
>>> mondrian.native.nonempty.enable</a></code></td>
>> 713,714c749,750
>> < <td><a
>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">
>>
>> < <code>mondrian.native.unsupported.alert</code></a></td>
>> ---
>>> <td><code><a
>>> href="api/mondrian/olap/MondrianProperties.html#AlertNativeEvaluationUnsupported">mondrian.native.unsupported.alert</a></code></td>
>>>
>> 727c763
>> < mondrian.rolap. generate.formatted .sql</a></code></td>
>> ---
>>> mondrian.rolap.generate.formatted.sql</a></code></td>
>> 738c774
>> < mondrian.rolap. maxConstraints</a></code></td>
>> ---
>>> mondrian.rolap.maxConstraints</a></code></td>
>> 766c802
>> < mondrian.xmla. drillthrough TotalCount.enable</a></code></td>
>> ---
>>> mondrian.xmla.drillthrough TotalCount.enable</a></code></td>
>> 775c811
>> < mondrian.xmla. drillthrough MaxRows</a></code></td>
>> ---
>>> mondrian.xmla.drillthrough MaxRows</a></code></td>
>> 812a849,850
>>> <tr>
>>> <td style="vertical-align: top;" colspan="4">
>> 813a852,885
>>> <b><br>Factories</b>
>>> </td>
>>> </tr>
>>> <tr>
>>> <td><code>
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#MemoryMonitorClass">
>>> mondrian.util.MemoryMonitor.class
>>> </a></code></td>
>>>
>>> <td>string</td>
>>> <td>-</td>
>>> <td>
>>> By default this property does not have a value. If set,
>>> then it is the class name of an implementation of
>>> the MemoryMonitor class and is used by the
>>> MemoryMonitorFactory to create the single instance.
>>> </td>
>>> </tr>
>>> <tr>
>>> <td><code>
>>> <a
>>> href="api/mondrian/olap/MondrianProperties.html#ExpCompilerClass">
>>> mondrian.calc.ExpCompiler.class
>>> </a></code></td>
>>>
>>> <td>string</td>
>>> <td>-</td>
>>> <td>
>>> By default this property does not have a value. If set,
>>> then it is the class name of an implementation of
>>> the ExpCompiler class and is used by the
>>> ExpCompiler.Factory to create each instance.
>>> </td>
>>> </tr>
>>>
>> 1091c1163
>> < Version: $Id: //open/mondrian/doc/configuration.html#20 $
>> ---
>>> Version: $Id: //open/mondrian/doc/configuration.html#21 $
>>
>> ==== //open/mondrian/mondrian.properties#35 (ktext) ====
>>
>> 1c1
>> < # $Id: //open/mondrian/mondrian.properties#34 $
>> ---
>>> # $Id: //open/mondrian/mondrian.properties#35 $
>> 71,75c71,75
>> <
>> #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
>>
>> < #mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>> < #mondrian.foodmart.jdbcUser=foodmart
>> < #mondrian.foodmart.jdbcPassword=foodmart
>> < #mondrian.jdbcDrivers=com.mysql.jdbc.Driver
>> ---
>>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart?user=foodmart&password=foodmart
>>>
>>> mondrian.foodmart.jdbcURL=jdbc:mysql://localhost/foodmart
>>> mondrian.foodmart.jdbcUser=foodmart
>>> mondrian.foodmart.jdbcPassword=foodmart
>>> mondrian.jdbcDrivers=com.mysql.jdbc.Driver
>> 284c284,290
>> < mondrian.util.memoryMonitor.percentage.threshold=90
>> ---
>>> # If enabled, when Java5 memory monitor detects that post-garbage
>>> # collection is above this value, notifications are generated.
>>> #mondrian.util.memoryMonitor.percentage.threshold=90
>>>
>>> ###############################################################################
>>>
>>> # Property for overriding default MemoryMonitor implementation.
>>> #mondrian.util.MemoryMonitor.class=null
>> 286a293
>>> # Property for overriding default ExpCompiler implementation.
>> 288c295,314
>> < #mondrian.calc.ExpCompiler=mondrian.olap.fun.ResultStyleCompiler
>> ---
>>> #
>>> # To test that for all test MDX queries that all functions can
>>> # handle requests for ITERABLE, LIST and MUTABLE_LIST evalutation
>>> # results, the following can be used:
>>> # mondrian.calc.ExpCompiler.class=mondrian.olap.fun.ResultStyleCompiler
>>> #
>>> #mondrian.calc.ExpCompiler.class=null
>>>
>>> ###############################################################################
>>>
>>> # Controls when a non-empty crossjoin input list will have the
>>> # optimiztion applied base upon the list's size.
>>> # The size of the list must be greater than the property value size
>>> # for optimiztion.
>>> # mondrian.olap.fun.crossjoin.optimizer.size=0
>>>
>>> ###############################################################################
>>>
>>> # If true, the the RolapResult will apply its implicit member
>>> # fix by merging axes when a non-empty crossjoin uses the incorrect
>>> # memebers.
>>> # mondrian.rolap.RolapResult.useImplicitMembers=true
>>
>> ==== //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 (ktext)
>> ====
>>
>> 2c2
>> < // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
>> ---
>>> // $Id: //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
>> 11a12
>>> import org.eigenbase.util.property.StringProperty;
>> 21c22
>> < * @version $Id:
>> //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#8 $
>> ---
>>> * @version $Id:
>>> //open/mondrian/src/main/mondrian/calc/ExpCompiler.java#9 $
>> 352a354,362
>>> /** * Return the <code>ExpCompiler.Factory</code
>>> property name. * * @return
>>> <code>ExpCompiler.Factory</code> property name
>>> */
>>> protected StringProperty getStringProperty() {
>>> return MondrianProperties.instance().ExpCompilerClass;
>>> }
>>
>> ==== //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65
>> (ktext) ====
>>
>> 2c2
>> < // $Id:
>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
>> ---
>>> // $Id:
>>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
>> 58c58
>> < * @version $Id:
>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#64 $
>> ---
>>> * @version $Id:
>>> //open/mondrian/src/main/mondrian/olap/MondrianProperties.java#65 $
>> 858c858
>> < this, "mondrian.util.memoryMonitor.enable", false);
>> ---
>>> this, "mondrian.util.memoryMonitor.enable", true);
>> 864a865,910
>>> /**
>>> * The <code>MemoryMonitor</code> class property. If the value is
>>> * non-null, it is used by the <code>MemoryMonitorFactory</code>
>>> * to create the implementation.
>>> */
>>> public final StringProperty MemoryMonitorClass = new StringProperty(
>>> this, "mondrian.util.MemoryMonitor.class", null);
>>>
>>> /**
>>> * The <code>ExpCompiler</code> class property. If the value is
>>> * non-null, it is used by the <code>ExpCompiler.Factory</code>
>>> * to create the implementation.
>>> */
>>> public final StringProperty ExpCompilerClass = new StringProperty(
>>> this, "mondrian.calc.ExpCompiler.class", null);
>>>
>>> /**
>>> * 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.
>>> */
>>> public final IntegerProperty CrossJoinOptimizerSize = new
>>> IntegerProperty(
>>> this, "mondrian.olap.fun.crossjoin.optimizer.size", 0);
>>>
>>> /**
>>> * The crossjoin optimizer is flawed. It evaluates potential cells
>>> * using default members when a member is not explicitly set in
>>> * the particular axis. This works unless another axis, normal or
>>> * slicer, uses a member other than the default.
>>> * Setting this property to <code>true</code> will enable the
>>> * RolapResult to collect these implied members and if any are
>>> * found, then re-evaluate using the discovered members.
>>> * <p>
>>> * If you do not enable this property, then the crossjoin optimizer,
>>> * if used, can produce errors. Bad results are produced for some
>>> * queries and some data sets - its a combination of both so the
>>> * error does not manifest itself all the time.
>>> */
>>> public final BooleanProperty UseImplicitMembers = new
>>> BooleanProperty(
>>> this, "mondrian.rolap.RolapResult.useImplicitMembers",
>>> true);
>>
>> ====
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7
>> (ktext) ====
>>
>> 2c2
>> < // $Id:
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
>> ---
>>> // $Id:
>>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
>> 14a15
>>> import org.eigenbase.util.property.StringProperty;
>> 40c41
>> < * @version $Id:
>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#6 $
>> ---
>>> * @version $Id:
>>> //open/mondrian/src/main/mondrian/util/MemoryMonitorFactory.java#7 $
>> 135a137,145
>>> /** * Return the <code>MemoryMonitorFactory</code property
>>> name. * * @return <code>MemoryMonitorFactory</code>
>>> property name
>>> */
>>> protected StringProperty getStringProperty() {
>>> return MondrianProperties.instance().MemoryMonitorClass;
>>> }
>>>
>>
>> ==== //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9
>> (ktext) ====
>>
>> 2c2
>> < // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
>> ---
>>> // $Id: //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
>> 11a12
>>> import org.eigenbase.util.property.StringProperty;
>> 278c279
>> < * @version $Id:
>> //open/mondrian/src/main/mondrian/util/ObjectFactory.java#8 $
>> ---
>>> * @version $Id:
>>> //open/mondrian/src/main/mondrian/util/ObjectFactory.java#9 $
>> 481,482c482,485
>> < * By default the name returned is the value of a property
>> < * with key equal to the class name of the
>> <code>interfaceClass</code>.
>> ---
>>> * The factory's <code>StringProperty</code> is gotten and
>>> * if it has a non-null value, then that is returned. Otherwise,
>>> * the <code>StringProperty</code>'s name (path) is used as the
>>> * name to probe the <code>Properties</code> object for a value.
>> 488,489c491,496
>> < return (props == null)
>> < ? null : props.getProperty(this.interfaceClass.getName());
>> ---
>>> final StringProperty stringProp = getStringProperty();
>>> final String className = stringProp.get();
>>> return (className != null) ? className
>>> : (props == null)
>>> ? null : props.getProperty(stringProp.getPath());
>> 491a499,505
>>> /** * Return the <code>StringProperty</code> associated with
>>> this factory. * * @return the <code>StringProperty</code>
>>> */
>>> protected abstract StringProperty getStringProperty();
>>>
>>
>
>


--
Quis custodiet ipsos custodes:
This email message is for the sole use of the intended recipient(s) and
may contain confidential information. Any unauthorized review, use,
disclosure or distribution is prohibited. If you are not the intended
recipient, please contact the sender by reply email and destroy all
copies of the original message.
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

Richard Emberson
02-21-2007, 03:20 PM
Can I see the stack trace.

RME


John V. Sichi wrote:
> John V. Sichi wrote:
>> Richard, another regression:
>> TestAggregationManager.testNonEmptyCrossJoinLoneAxis now fails with a
>> stack overflow. If I sync back to eigenchange 8726, it works fine.
>
> (Note that this test is only enabled for Derby, because it verifies SQL
> generation, so the reason you didn't hit it is probably that you
> normally run regression with a different DBMS.)
>
> JVS
>


--
Quis custodiet ipsos custodes:
This email message is for the sole use of the intended recipient(s) and
may contain confidential information. Any unauthorized review, use,
disclosure or distribution is prohibited. If you are not the intended
recipient, please contact the sender by reply email and destroy all
copies of the original message.
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

John V. Sichi
02-21-2007, 03:30 PM
Richard Emberson wrote:
> Can I see the stack trace.

Use the derby.jar that's checked into Perforce and run the test.

JVS
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

John V. Sichi
02-21-2007, 03:40 PM
John V. Sichi wrote:
> Richard Emberson wrote:
>> Can I see the stack trace.
>
> Use the derby.jar that's checked into Perforce and run the test.

I've included a portion of the stack below (one of the usual tangles
between calculated member and necj's); of course it goes on and on.

JVS

----

[java] 1)
testNonEmptyCrossJoinLoneAxis(mondrian.rolap.TestAggregationManager)java.lang.StackOverflowError
[java] at
mondrian.rolap.RolapNativeSet.checkMemberChildren(RolapNativeSet.java:559)
[java] at
mondrian.rolap.RolapNativeSet.checkCrossJoinArg(RolapNativeSet.java:641)
[java] at
mondrian.rolap.RolapNativeSet.checkCrossJoin(RolapNativeSet.java:611)
[java] at
mondrian.rolap.RolapNativeCrossJoin.createEvaluator(RolapNativeCrossJoin.java:73)
[java] at
mondrian.rolap.RolapNativeRegistry.createEvaluator(RolapNativeRegistry.java:44)
[java] at
mondrian.rolap.RolapSchemaReader.getNativeSetEvaluator(RolapSchemaReader.java:459)
[java] at
mondrian.olap.DelegatingSchemaReader.getNativeSetEvaluator(DelegatingSchemaReader.java:200)
[java] at
mondrian.olap.fun.NonEmptyCrossJoinFunDef$1.evaluateList(NonEmptyCrossJoinFunDef.java:50)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:116)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.olap.ExpCacheDescriptor.evaluate(ExpCacheDescriptor.java:81)
[java] at
mondrian.rolap.RolapEvaluator.getCachedResult(RolapEvaluator.java:656)
[java] at
mondrian.olap.fun.CacheFunDef$1.evaluate(CacheFunDef.java:59)
[java] at
mondrian.calc.impl.GenericCalc.evaluateList(GenericCalc.java:40)
[java] at
mondrian.olap.fun.AbstractAggregateFunDef.evaluateCurrentList(AbstractAggregateFunDef.java:63)
[java] at
mondrian.olap.fun.AggregateFunDef$1.evaluate(AggregateFunDef.java:56)
[java] at
mondrian.rolap.RolapEvaluator.evaluateCurrent(RolapEvaluator.java:428)
[java] at
mondrian.olap.fun.CrossJoinFunDef.optimizeNonEmptyList(CrossJoinFunDef.java:2202)
[java] at
mondrian.olap.fun.CrossJoinFunDef.nonEmptyOptimizeList(CrossJoinFunDef.java:1087)
[java] at
mondrian.olap.fun.CrossJoinFunDef.crossJoin(CrossJoinFunDef.java:1867)
[java] at
mondrian.olap.fun.NonEmptyCrossJoinFunDef$1.evaluateList(NonEmptyCrossJoinFunDef.java:65)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:116)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.olap.ExpCacheDescriptor.evaluate(ExpCacheDescriptor.java:81)
[java] at
mondrian.rolap.RolapEvaluator.getCachedResult(RolapEvaluator.java:656)
[java] at
mondrian.olap.fun.CacheFunDef$1.evaluate(CacheFunDef.java:59)
[java] at
mondrian.calc.impl.GenericCalc.evaluateList(GenericCalc.java:40)
[java] at
mondrian.olap.fun.AbstractAggregateFunDef.evaluateCurrentList(AbstractAggregateFunDef.java:63)
[java] at
mondrian.olap.fun.AggregateFunDef$1.evaluate(AggregateFunDef.java:56)
[java] at
mondrian.rolap.RolapEvaluator.evaluateCurrent(RolapEvaluator.java:428)
[java] at
mondrian.olap.fun.CrossJoinFunDef.optimizeNonEmptyList(CrossJoinFunDef.java:2202)
[java] at
mondrian.olap.fun.CrossJoinFunDef.nonEmptyOptimizeList(CrossJoinFunDef.java:1087)
[java] at
mondrian.olap.fun.CrossJoinFunDef.crossJoin(CrossJoinFunDef.java:1867)
[java] at
mondrian.olap.fun.NonEmptyCrossJoinFunDef$1.evaluateList(NonEmptyCrossJoinFunDef.java:65)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:116)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.olap.ExpCacheDescriptor.evaluate(ExpCacheDescriptor.java:81)
[java] at
mondrian.rolap.RolapEvaluator.getCachedResult(RolapEvaluator.java:656)
[java] at
mondrian.olap.fun.CacheFunDef$1.evaluate(CacheFunDef.java:59)
[java] at
mondrian.calc.impl.GenericCalc.evaluateList(GenericCalc.java:40)
[java] at
mondrian.olap.fun.AbstractAggregateFunDef.evaluateCurrentList(AbstractAggregateFunDef.java:63)
[java] at
mondrian.olap.fun.AggregateFunDef$1.evaluate(AggregateFunDef.java:56)
[java] at
mondrian.rolap.RolapEvaluator.evaluateCurrent(RolapEvaluator.java:428)
[java] at
mondrian.olap.fun.CrossJoinFunDef.optimizeNonEmptyList(CrossJoinFunDef.java:2202)
[java] at
mondrian.olap.fun.CrossJoinFunDef.nonEmptyOptimizeList(CrossJoinFunDef.java:1087)
[java] at
mondrian.olap.fun.CrossJoinFunDef.crossJoin(CrossJoinFunDef.java:1867)
[java] at
mondrian.olap.fun.NonEmptyCrossJoinFunDef$1.evaluateList(NonEmptyCrossJoinFunDef.java:65)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.olap.fun.GenerateFunDef$GenerateListCalcImpl.evaluateList(GenerateFunDef.java:116)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.rolap.RolapResult.evaluateExp(RolapResult.java:503)
[java] at
mondrian.rolap.RolapResult.access$200(RolapResult.java:42)
[java] at
mondrian.rolap.RolapResult$RolapResultEvaluatorRoot.evaluateNamedSet(RolapResult.java:847)
[java] at
mondrian.rolap.RolapEvaluator.evaluateNamedSet(RolapEvaluator.java:689)
[java] at
mondrian.mdx.NamedSetExpr$1.evaluateList(NamedSetExpr.java:78)
[java] at
mondrian.calc.impl.AbstractListCalc.evaluate(AbstractListCalc.java:67)
[java] at
mondrian.olap.ExpCacheDescriptor.evaluate(ExpCacheDescriptor.java:81)
[java] at
mondrian.rolap.RolapEvaluator.getCachedResult(RolapEvaluator.java:656)
[java] at
mondrian.olap.fun.CacheFunDef$1.evaluate(CacheFunDef.java:59)
[java] at
mondrian.calc.impl.GenericCalc.evaluateList(GenericCalc.java:40)
[java] at
mondrian.olap.fun.AbstractAggregateFunDef.evaluateCurrentList(AbstractAggregateFunDef.java:63)
[java] at
mondrian.olap.fun.AggregateFunDef$1.evaluate(AggregateFunDef.java:56)
[java] at
mondrian.rolap.RolapEvaluator.evaluateCurrent(RolapEvaluator.java:428)
[java] at
mondrian.olap.fun.CrossJoinFunDef.optimizeNonEmptyList(CrossJoinFunDef.java:2202)

_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

John V. Sichi
02-23-2007, 05:30 AM
Richard Emberson wrote:
> John,
>
> If you put your local properties into a file, say
> local.properties, and then call the build script
> passing that that file name, e.g.,
>
> > ./build.sh -propertyfile local.properties test
>
> it will pick up the properties from that file.
> Since I wrap all calls to the build script, I
> don't have to type it in all the time.

Thanks; that works well for a command-line person like me. I found out
that with the most excellent CmdRunner, you can also aggregate property
files by specifying -p multiple times on the same command line.

However, this still doesn't fix the problem for the IDE crowd, does it?

JVS
_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian

Julian Hyde
02-23-2007, 04:12 PM
> John Sichi wrote:
>
> However, this still doesn't fix the problem for the IDE
> crowd, does it?

The IDE crowd are going to have to continue to be careful.

:)

Julian

_______________________________________________
Mondrian mailing list
Mondrian (AT) pentaho (DOT) org
http://lists.pentaho.org/mailman/listinfo/mondrian